首页 > 代码库 > 88. Notes客户端开发中的Java

88. Notes客户端开发中的Java

回顾一下,在Lotus Notes杂谈专栏中,我陆陆续续写的关于Notes里Java编程的文章也有不少:6. Lotus Notes中的开发语言、8. 从Lotusscript到Java、22. 为什么要在XPages中写Java?、31. 怎样在Xpages应用中写Java、42. Lotus Notes中的垃圾回收之Java等等。这篇文章继续谈谈Notes客户端开发中的Java。
用Java进行Notes界面操作?
Notes作为一个软件和开发平台,从历史上看总的发展趋势是可编程性不断提高。R4引入了LotusScript和Java。Notes平台是以本机(native)代码运行的,采用LotusScript这样一种脚本语言嵌入式地编写用户逻辑显得更轻便。不过随着熟练的程序员想要开发越来越多复杂的功能,LotusScript的语法和功能时时显得原始笨拙和不敷使用:缺少面向对象高级特性的支持、不便的错误处理方式等等。每当此时,我们就会期望能用Java这样更现代和强大的语言来开发。要这样做最大的障碍来自Java类库只包含Notes后端对象,而没有NotesUIWorkspace和NotesUIDocument这样的前端对象,无法进行Notes用户界面的操作。而这又是由于Notes本机代码和运行Java代理的虚拟机在不同线程中,不能同时操作用户界面。R8后,Notes客户机采用Eclipse平台,前台运行的是一个Java的图形用户界面程序,通过JNI接驳后台运行的nlnotes.exe,原生的Notes操作和界面显示仍由nlnotes进程负责。因为直接掌控用户界面的已经是Java代码,通过其操作Notes的用户界面也成为可能和必须,Java的Notes客户机notes2.exe本身就在这样做。IBM也将此API公布出来,即是在Designer帮助里能看到的Notes Client Java UI APIs:
 技术分享
在OpenNTF上有利用此API演示各种界面功能的项目,从视频可以更直观地看到该API的能力。
如果你看到这里,心情激动,跃跃欲试想在今后的开发中完全使用Java,那不幸的是IBM又要让你失望了。这些Java接口只能用于Eclipse插件(plugin)开发,不能在普通Notes客户机应用程序中,也就是Java代理中使用,原因仍然是线程之间的冲突。如果在插件里调用,入口的Java线程将Notes原生的用户界面的任务交给nlnotes.exe;如果在代理中调用,nlnotes.exe启动Java代理,后者又要将用户界面的工作传给nlnotes.exe,对用户界面的操作将会在不同线程中。所以对于传统的Notes客户端应用程序,老旧的LotusScript仍然是主要的开发语言。
调试Java代理
在R8.5以前,Designer对Java的开发支持也就比用普通的文本编辑器稍好一些,完全算不上集成开发环境(IDE)。那时如果要调试Java代理,须采用所谓的two-headed beast方法,即在Eclipse之类的现代Java IDE里编写代码,在主要类(main class)里写一个入口方法,在Notes里运行时在代理的NotesMain方法里调用,在Eclipse里调试时则通过标准Java应用程序的main方法调用。R8.5之后,Designer移植到Eclipse平台,文本代码的编辑和设计元素的属性等都由Eclipse的视图来展现,但是表单视图等二进制设计元素的修改仍然是交给原生的nlnotes.exe。我们有理由认为对Java代码的调试在Designer内就能由Eclipse完成。事实也确实如此,帮助文档里有调试java代理的详细步骤。这项帮助有些晦涩,而且关键是要求在代理里写入sleep代码,这对于调试是额外的笨拙的手续,也使得代码在调试和生产状态之间切换更加麻烦。幸运的是,这项要求实际是多余的。Martin Vereecken在他的博客文章Debugging Java code in Domino Designer 8.5 or 9列出了更清晰的步骤。我在下面稍加翻译和整理:
Designer的设置:
1.    向notes.ini添加JavaEnableDebug=1参数。
2.    选择菜单Tools -- > Java Debugging Preferences,在对话框的Client Agents/Applets行设置端口,采用默认值8701就可以。
3.    重启Notes。

代理的设置:
1.    打开要调试的java代理,在属性标签页的基本栏(Properties tab – Basics)里选择Compile Java code with debugging information。
2.    打开主要类,如JavaAgent.java。选择菜单Run – Debug Configurations…,在Remote Java Application下新建一个设置,设置端口号为你在上面步骤2填的数字。点击应用。

开始调试:
1.    在java代理的入口方法或者你想要停止的地方添加断点。
2.    切换到调试视角(Debug Perspective),菜单Window --> Open Perspective --> Other…  -- >Debug,或者可以用快捷键Ctrl+8在不同视角间切换。
3.    用工具栏的图标或者菜单启动你刚才添加的调试设置,如Run --> Debug Configurations --> JavaAgent。
4.    启动java代理。
一切顺利的话,你将会看到熟悉的在Eclipse里调试java的界面,代理停止在断点处。

有几点值得注意的地方:
1.    调试设置是针对某个代理的(在设置的project写明了当前代理),如果要调试另外一个代理,还得再建一个设置。
2.    调试设置是临时的,重新启动Designer后会丢失。
3.    调试java代理仍然不像调试标准的java应用程序,而属于调试远程java程序。原理是Designer先启动对端口8701的监听,Eclipse再附加到指定主机和端口的java虚拟机,在这里就是Notes本身。这个过程在实际中时常会出错,正常的情况有调试完成后没有手工脱离附加的虚拟机,再次调试就会报错连接不上。异常的情况下,所有设置都没错,更换端口、重启Notes和计算机都仍然连接不上。
 技术分享

88. Notes客户端开发中的Java