使用 Lotus Notes 和 Eclipse 管理和运行 Java 程序
Java和LotusNotes/Domino是理想的开发组合。将它们组合在一起,可以使Notes/Domino开发人员充分利用其常用开发环境DominoDesigner中目前可用的所有Java代码和包。
Eclipse大概是最好的集成开发环境之一,它提供了非常丰富的特性,其中包括上下文相关操作、视图、富调试程序(richdebugger)和重构。重构可以将Java代码重新命名、移动、添加和提取到新的方法中,以减轻清除初始编码尝试的工作量,使其简洁易读,并使其成为您要向其他开发人员显示的代码。对许多开发工作来说,重构是Eclipse最好的一项功能。
有了调试LotusNotes/Domino7中的Java代理的能力,现在就可以协调LotusNotes/Domino和Eclipse,为Notes/Domino应用程序创建设计优良的可调试Java代理项目。
进行任何LotusWorkplace开发都需要确实了解Eclipse是如何工作的。LotusNotes/Domino7提供了一个现在开始学习Eclipse的极好理由,既将它用于Notes/Domino的一些操作,增加将来也可以应用于LotusWorkplace项目的技能。
本文讲述了如何安装Eclipse,如何为LotusNotes/Domino创建项目,以及如何将这个项目导入DominoJava代理中,然后调试该代理。本文还提供了调试这些代理的一些技巧和可能遇到的陷阱。
安装Eclipse
WebSphereStudioApplicationDeveloper是基于Eclipse的,所以如果安装了Eclipse,就可以随同本文了解如何使用WebSphereStudioApplicationDeveloper。如果没有安装Eclipse或WebSphereStudioApplicationDeveloper,那么您需要先获得这两个应用程序。Eclipse可以从Eclipse基础网站免费下载。WebSphereStudioApplicationDeveloper的试用版也能找到。
下载Eclipse或WebSphereStudioApplicationDeveloper。Eclipse很容易安装;Eclipse的Web站点上有安装说明。下载了用于Windows的zip文件之后,需要运行eclipse.exe文件。WebSphereStudioApplicationDeveloper比较复杂。请参考相应文档,以获得安装说明。
注意:下面的步骤讲述的是Eclipse3.0。如果您安装了Eclipse的其他版本,可能会发现用户界面以及步骤与本文中讲述的有所不同。
Eclipse和RationalClearCase源代码控制
如果要集成Eclipse和RationalClearCase源代码控制系统,可以下载并安装IBMRationalClearCaseSCMadaptersforEclipse2.11。否则,默认源代码控制系统是CVS。
在Eclipse中创建新的Java项目
安装了Eclipse和所有插件后,现在就可以创建项目,并以此作为Notes/Domino工作的开始。必须在一个项目内存储所有Java代码。在工作区中可以有多个项目。在计算机中还可以有多个工作区,可以使用eclipse.exe的–data开关来指向不同的工作区。
要创建新的Java项目,需要打开Eclipse,选择File-New-Project。然后在NewProject对话框中选择JavaProject,最后单击Next。
图1.NewProject对话框
输入项目名称,然后单击Finish。创建了项目后,要更改项目属性中的路径,使其指向Notes.jar文件。右击PackageExplorer附签中的项目并选择Properties。在Properties对话框中,选择JavaBuildPath,然后选择Libraries附签。单击AddExternalJARs按钮,导航到Notes.jar文件,以将其添加到类路径中。
图2.Properties对话框
添加了JAR文件之后,可以使用项目中NotesJavaAPI定义的类和接口。DominoDesigneron-linehelp中有关于NotesJavaAPI的文档。
接着,需要下载Sun1.3.1JRE。或者,如果计算机上安装了Domino服务器,可以使用该服务器的JVM。Notes客户机和Domino服务器应该是匹配的,以确保构建项目所用的JVM与从服务器任务或代理服务器任务调用时代理和程序将运行的JVM相同。
LotusNotes/Domino的当前版本使用的是Java1.3.1,所以必须安装该软件以使用正确的版本来构建项目。(LotusNotes/Domino7使用JDK1.4。)虽然许多Java代理和程序都可以编译,而且没什么问题,但可能会陷入另一些问题,比如使用一个JDK版本构建程序,却在另一个版本上运行。如果安装了Eclipse3.0,因为它是基于Java1.4.2的,所以需要删除JDKSystemLibrary并创建一个新库来指向JDK1.3.1安装。要进行这项操作,需要选中Libraries附签的Properties对话框中的JRESystemLibrary,并单击Remove。
要添加新库,可以单击AddLibrary按钮。在AddLibrary对话框中,选择JRESystemLibrary,然后单击Next。选择AlternativeJRE选项(如果尚未选择)。然后单击InstalledJREs按钮。单击Add并完成AddJRE对话框来添加JDK1.3.1。
图3.AddJRE对话框
保存对项目的更改。
创建第一个Java代理
DominoDesigner在开始时会自动为您填充第一个Java代理。不过,Eclipse不会这样,所以它需要创建新类,来实现正确的AgentBase接口,获取Domino会话和agentcontext对象。可以使用DominoDesigner中的代码作为指导。
图4.DominoDesignerJava代理
将骨干Java代码从DominoDesigner直接复制到Eclipse项目中的新类中。我们建议您创建新的包,并于其中存储代理。这将有助于组织项目,并且这符合一般Java设计原则。要创建新的包,可以选择File-New-Package。
图5.NewJavaPackage对话框
我们创建名为com.ibm.NotesJava.agents的包,因为是在IBM工作,并且这是我们的NotesJava项目。我们将在这个包中存储代理。可以看到的其他常见包是com.sun.*、org.apache.*和核心Java语言函数的java.lang.*。至于如何组织包有一整套原则,但这不在本文讨论范围内,重要的是不要将代理和代码放在默认包中,因为这个包杂乱且不专业。
现在已经有了新包,所以可以创建新的Java类。要在Eclipse中创建新的Java类,可以选择File–New–Class。Eclipse的效率非常高,所以如果已经选择了包,那么Eclipse将填充包名称。可以在这里添加名称和超类了。对于Notes代理,超类必须始终是lotus.domino.AgentBase。在DominoDesigner中,该操作是自动进行的,但在Eclipse中,必须手工完成这项操作。
图6.NewJavaClass对话框
在创建类之后,就可以输入剩余的代理代码,从而使其看起来与DominoDesigner示例中的代理一样。
图7.Eclipse中的JavaAgent
构建代理时,将在包目录中创建JavaAgent.class文件。现在已经有了类文件,我们可以将其导入DominoDesigner中的代理中,并在Eclipse中管理代码。在DominoDesigneron-linehelp中,请参阅“ImportJava”主题,以获取更多信息。在将文件导入代理中之后,当调用该代理时,可以运行已经编写的Java代码。现在就可以使用Eclipse调试程序来调试该代码了。
调试Java代码
Eclipse封装了Java调试程序,使您能够遍历和更改变量,监视项并在Java代码中添加断点。第一步是在调试模式下加载LotusDomino中JVM。这样可以强迫JVM停止,等到附加了调试程序后再继续进行其操作。LotusNotes/Domino6或之后的版本中包含这项功能,要启用该功能,可以添加Notes.ini变量JavaEnableDebug=1,然后重新启动服务器。
下一阶段是在服务器上运行代理,并等待服务器冻结代理的执行。在冻结代理的执行之后,JVM将等待调试程序附加到TCP/IP端口9788。
打开Eclipse和项目。选择Run-Debug来打开Debug对话框,然后选择RemoteJavaApplication,单击New创建新的调试会话。最后,在Connect附签中,指定服务器的主机名称,如果服务器在所调试的计算机上,则指定本地主机的名称。
图8.Debug对话框
对于高级用户,可以按如下所示改变端口号和调试设置:
JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000
Suspend=n没有冻结服务器来等待调试连接,所以可以错过代理的启动。该调试设置允许您将额外参数传送给服务器中的JVM调试程序。如果您有自己喜欢的设置,也可以在这里使用。
最好是代理代码中已经设置了断点。当在调试模式下使用Eclipse将代码附加到服务器时,它应该会自动断开,并允许您检查变量,设置其他断点,执行需要使用的其他所有调试任务。
其他Eclipse指针
现在Eclipse中已经有了项目,它提供了DominoDesigner内大型Java项目所没有的许多增强开发和组织任务。DominoDesigner适用于较小的Java任务,比如获取或设置多个值或简单的报表。不过,一旦开始将代码分入不同的包、定义接口并将工作委托给其他人,项目管理会变得更复杂。
Eclipse包含用于协同工作的内置工具,其中包括CVS源代码控制集成。RationalClearCase源代码控制插件允许您附加到ClearCase中存储的Eclipse项目中。它提供了自动或即时的代码检入和检出、简洁的修饰符,从而可以轻松地标识源代码控件中的对象及其状态。
Eclipse中另一项非常有用的功能是可以重构项目。例如,可以选择代码的一部分并将其移至它自己的方法中。如果您有一个非常长的方法,想将其分入较小的步骤中,那么可以将这项操作自动化,Eclipse能够帮助您实现该自动化。下列代码片断是一个重构示例:
Initialfunction
publicvoidNotesMain(){
try{
Sessionsession=getSession();
AgentContextagentContext=session.getAgentContext();
Databasedb;
//Iamrunningthis,usetheserver-oritcanassumeitislocal
if(session.getUserName().equals("CN=IanConnor/OU=Westford/O=IBM")==true)
db=session.getDatabase("support/iris","support/retain.nsf");
else
db=session.getDatabase("","support/retain.nsf");
System.out.print(db.getFileName());
}catch(Exceptione){
e.printStackTrace();
}
}
可以选择要移至其自己的函数的代码部分,然后选择Refactor-ExtractMethod。这将确定需要传送的参数和应该返回的数据。您所需要做的就是选择方法名称。然后可以预览更改,查看要进行的操作。这将有助于您更好地组织代码,使试图了解代码的其他人更容易维护代码。正如所有开发人员都知道的,包含较短函数的、简洁的、组织良好的代码基数(codebase)要比非常长的、似乎不会结束的1000行函数容易使用得多。
publicvoidNotesMain(){
try{
Sessionsession=getSession();
AgentContextagentContext=session.getAgentContext();
Databasedb;
db=getRetainDatabase(session);
System.out.print(db.getFileName());
}catch(Exceptione){
e.printStackTrace();
}
}
privateDatabasegetRetainDatabase(Sessionsession)throwsNotesException{
Databasedb;
//Iamrunningthis,usetheserver-oritcanassumeitislocal
if(session.getUserName().equals("CN=IanConnor/OU=Westford/O=IBM")==true)
db=session.getDatabase("support/iris","support/retain.nsf");
else
db=session.getDatabase("","support/retain.nsf");
returndb;
}
重构是所有开发工作的基础部分。我们总是不愿意立即共享代码的第一个cut。在使用新的API或新的工作方式时更是如此。先是花费大量时间编写了一小部分代码,以测试其如何工作,然后当可以运行该代码时,将停下来适当组织代码,使查看该代码的人能够看懂。
结束语
Eclipse是Notes开发人员可以在其当前和将来项目中使用的非常有用的平台。它可以帮助开发人员更好地组织项目,与小组中的其他人共享代码,并更好地利用Java设计技术,如接口和代码分隔。随着LotusWorkplace和LotusNotes/Domino的集成度越来越高,Java和Eclipse将发挥重要的作用。Notes开发人员现在可以凭借自己的合并和群件技能进行构建,同时还要准备应付未来的挑战。
新的产品或工作方式必须具有一些重要功能和优点,才能确保人们愿意采用该产品或方式。对于必须提交编写得很好的、提供优质Java代码的应用程序的Notes开发人员来说,Eclipse提供了调试、重构和源代码控制。所有这些在任何重要的开发工作中都是重要的功能,它们将确保与得到的成果相比,您花费时间学习如何使用Eclipse进行Notes开发是非常值得的。