Tim deBoer,WebSphere Studio 开发团队
Gary Karasiuk,Java 解决方案设计师
IBM 多伦多实验室
2001 年 12 月
©2001 International Business Machines Corporation. All
rights reserved.
一般 J2EE 尤其是 WebSphere® Application Server 使用复杂的技术来构建和装入类。象许多开发者一样,您可能想知道它们是如何组织在一起的,如何设计项目才能节省时间并且充分利用开发环境。
本文提供有关 J2EE 规范以及如何使用它在 WebSphere Studio Application
Developer 中构建项目的信息。除了创建基本的 J2EE 应用程序,我们还将研究一些 Application Developer 的最佳实践和高级功能部件。最后,我们将为您提供一个扎实的基础以便处理“可怕的”ClassNotFoundException。
J2EE 规范描述三种类型的模块:Web 模块、EJB 模块和应用程序客户机模块。当部署到 J2EE 应用程序服务器时,通常会将所有这些模块都压缩到单个
J2EE 应用程序 EAR 文件中。在以下每一节中会讨论一种模块以及如何使用 Application Developer 来构建它。
Web 模块包含 HTML、图像、JSPs™、Java™ 类和 servlet,以及创建
Web 应用程序所需的所有其它资源。象其它模块一样,Web 模块包含一个部署描述符。在 Web 模块中,部署描述符 web.xml
具有 servlet 初始化和映射信息以及用于在应用程序服务器中运行 Web 模块的其它设置。
Web 模块有两个特殊的 Java 代码文件夹:WEB-INF/classes
和 WEB-INF/lib
。classes 文件夹可以包含“松散(loose)”Java 类(不在 JAR 文件中的类),并且可以将它用于
Web 应用程序范围内的 servlet 或实用程序类。通常对于这个文件夹使用特殊的类装入器,因此如果对类进行更改,则应用程序服务器会自动将它们重新装入。lib
文件夹可以包含也是由 Web 应用程序使用的 JAR 文件(而不是 ZIP 文件!)。应该将第三方 JAR 文件和其它实用程序 JAR 文件放入这个文件夹。如果
JAR 文件被其它 Web 或 EJB 模块使用,则按照下面的企业应用程序一节中的说明将它们移动到“企业应用程序”项目中。
在 Application Developer 中,Web 模块由 Web 项目表示,它包含两个文件夹:source
和 webApplication。webApplication 文件夹包含扩展形式的完整 J2EE Web 模块。source 文件夹用于存放 .java
文件,因为它们常常不是部署的 Web 模块的一部分。当您在这个文件夹中创建 Java 资源时,会自动编译它们并将它们放入 webApplication/WEB-INF/classes
文件夹。这会使 Web 项目始终保持同步,并准备好测试或导出。
如果从 WAR 文件导入了 Web 模块,则可能注意到 lib 文件夹中的 projectname_classes.jar
文件。这个文件包含导入的 WAR 文件的原始内容。如果 WAR 文件包含源代码,则删除该文件,因为类将在 classes 文件夹中冗余地出现。
EJB 模块包含 EJB bean、其特定于服务器的部署代码、部署描述符和助手类(可选的)。它们包含应用程序的业务逻辑,并且在一般情况下由
Web、Application Client 和其它 EJB 模块调用。
在 Application Developer 中,EJB 模块由 EJB 项目表示。这些项目还有两个文件夹,bin
和 ejbModule。EJB 模块的源代码保存在 ejbModule 文件夹中。当更改和生成部署代码时,将这个文件夹中的 Java 类编译到
bin 文件夹中。将剩余的资源(例如,部署描述符)也复制到 bin 文件夹中。与 Web 项目的 webApplication 文件夹类似,bin
文件夹总是包含完整的已部署的 EJB 模块。与 Web 项目不同的是,不应该以任何手工方式修改 bin 文件夹,否则可能丢失更改。在 ejbModule
文件夹中进行所有更改,将会自动编译这些更改或将它们复制到 bin 文件夹中。
如果从 EJB JAR 文件中导入 EJB bean,则可能注意到位于您项目根目录中的 Xxx_importedClasses.jar
文件。这个文件包含导入的 EJB JAR 文件的原始内容。如果 JAR 包含源代码,则删除该文件,因为类将在 bin 文件夹中冗余地出现。
使用应用程序客户机模块以包含全功能客户机 Java 应用程序(非基于 Web),它连接到并使用在服务器中定义的
J2EE 资源。通过将客户机代码放入应用程序客户机模块而不是简单 JAR 文件,应用程序客户机将得益于服务器的资源(它不需要将类路径重新指定到
J2EE 和服务器 jar 文件)以及更方便的 JNDI 查询(服务器填充初始上下文和其它参数)。
在 Application Developer 中,应用程序客户机模块由应用程序客户机项目表示。对于大部分模块来说,可以象在
Java 项目中创建独立的 Java 应用程序一样工作。
企业应用程序是一个或多个 Web、EJB 或应用程序客户机模块的组合。作为这些其它模块的超集,它可以包含可能是多个模块组合的完整的应用程序。除了是一个有效的组合机制外,企业应用程序还在完整的应用程序级别上部署和维护代码,与作为单个代码片段相比,这更加容易。企业应用程序也可以重设被包含的模块的部署描述符内部的设置,以更实用的方式来组合或部署它们。
企业应用程序可能包含所含模块使用的 JAR 文件。这允许在应用程序级别上共享代码,并且还是放置由多个 Web
或 EJB 模块使用的实用程序 JAR 文件的最佳位置。通过将这些 JAR 文件放入企业应用程序而不是全局类路径,它们同时也符合 J2EE
规范,在移动到新服务器时不需要特殊发布和设置。
在 Application Developer 中,企业应用程序是由企业应用程序项目表示的。因为没有直接将源代码构建到企业应用程序,所以这些项目没有子文件夹。
WebSphere Application Server 使用几个类装入器来遵循 J2EE 规范。除了使用类路径环境变量定位并装入类的常规类装入器之外,还有许多正在工作的其它类装入器。
下面的图 1 显示了 WebSphere 中正在工作的类装入器的简化图。每个椭圆代表一个类装入器,方括号中的文本描述了类装入器在何处查找类。