J2EE类装入过程

Web 模块

Web 模块包含 HTML、图像、JSps™、Java™类和 servlet,以及创建 Web 应用程序所需的所有其它资源。象其它模块一样,Web 模块包含一个部署描述符。在 Web 模块中,部署描述符 web.xml 具有 servlet 初始化和映射信息以及用于在应用程序服务器中运行 Web 模块的其它设置。

Web 模块有两个特殊的 Java 代码文件夹: WEB-INF/classesWEB-INF/lib 。classes 文件夹可以包含“松散(loose)”Java 类(不在 JAR 文件中的类),并且可以将它用于 Web 应用程序范围内的 servlet 或实用程序类。通常对于这个文件夹使用特殊的类装入器,因此如果对类进行更改,则应用程序服务器会自动将它们重新装入。lib 文件夹可以包含也是由 Web 应用程序使用的 JAR 文件(而不是 ZIp 文件!)。应该将第三方 JAR 文件和其它实用程序 JAR 文件放入这个文件夹。

在 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 模块包含 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 文件夹中冗余地出现。

WebSphere 类装入器

WebSphere Application Server 使用几个类装入器来遵循 J2EE 规范。除了使用类路径环境变量定位并装入类的常规类装入器之外,还有许多正在工作的其它类装入器。

下面的图 1 显示了 WebSphere 中正在工作的类装入器的简化图。每个椭圆代表一个类装入器,方括号中的文本描述了类装入器在何处查找类。


图 1. WebSphere 类装入器
WebSphere 类装入器

在顶部,常规 Java 系统类装入器使用类路径环境变量来装入类。第二个类装入器是特定于 WebSphere 的并且使用 ws.ext.dirs 环境变量来装入类。除了装入所有用户代码之外,这个装入器还装入在运行时所需的所有 WebSphere 和 J2EE 类。最后,由一个或多个模块类装入器来装入运行在服务器中的模块。它们遵循前面讨论的 J2EE 类装入规则来从应用程序装入类和 JAR 文件。

上面的图 1 中最重要的是将每个类装入器定义成其上面的类装入器的子类。无论何时需要装入类,类装入器通常将请求委派给其父类装入器。如果父类装入器无法找到该类,则原始类装入器试图装入该类。请求只能在树中上行而不能下行。如果请求 WebSphere 类装入器查找 J2EE 模块中的类,它不能下行至模块类装入器来查找该类,并且将出现 ClassNotFoundException。一旦由类装入器装入一个类,则它尝试要装入的任何新类将重用同一个类装入器,或者沿着该路径上行直到找到该类为止。

两种情况下,您可能遇到问题。

  • WebSphere、J2EE 和任何全局类无法“看见”包含在应用程序中的类。如果将 JAR 文件添加到全局类路径或 ws.ext.dirs 属性中,则它就不再取决于模块中的类了。

  • 如果需要全局地将数据库驱动程序或实用程序 JAR 添加到类路径,则必须将它们添加到 ws.ext.dirs 属性而不是添加到全局类路径。如果错误地将它们添加到全局类路径,则它们将无法装入(例如)J2EE JAR 文件中的连接池类。这将再次作为 ClassNotFoundException 出现在数据库驱动程序上,但是,对数据库驱动程序类而言,向下查看 J2EE 类是错误的。

查找资源(属性文件、图像等)的公共可移植技术是使用类装入器的 findResourceXX 方法。基于前面的讨论,您可以看出为什么对这个作业使用正确的类装入器是重要的。例如,如果使用 WebSphere 类装入器,您将不能在模块中找到任何资源。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值