现在的位置: 首页 > 综合 > 正文

使用了第三方类库的EJB如何打包 共用了第三方类库的 J2EE 项目如何打包

2018年02月04日 ⁄ 综合 ⁄ 共 3104字 ⁄ 字号 评论关闭

使用了第三方类库的EJB如何打包

       在实际项目中,我们经常需要使用第三方的类库。这些类库应该放在哪里?EJB 应用一般都有被“卸出”(这里指装入的反向过程)的能力,这种能力由部署时装入它们的类装载器支持。

     如果我们把第三方类库放入应用服务器的标准类路径([jboss 安装目录]\server\all\lib),这些类很可能完全失去被卸出的能力。这样,如果 EJB 应用要更新某个第三方类库的版本,重新部署 EJB 应用时,第三方类库也要重新部署。在这种情形下,把第三方类库放入应用服务器标准类路径很不方便,因为每次部署 EJB 应用时,都要重新启动整个应用服务器,这显然不是理想的选择。

   适合放入应用服务器类路径的第三方类库通常是一些通用类库,如 JDBC 驱动。

对于针对特定应用的第三方类库,最理想的选择是把他们放入 EJB Jar 文件中。每一个 JAR 文件里都有一个manifest 文件,这个文件由 jar 工具自动创建,默认名字是 MANIFEST.MF。我们可以在 manifest 文件中加入一个Class-Path 属性,引用它所依赖的 JAR 文件。我们可以手工编辑 manifest.mf 文件,在原有内容的基础上,添加Class-Path 属性。Class-Path 属性的值是用来搜索第三方类库的相对 URL。这个 URL 总是相对于包含 Class-Path属性的组件。单个
Class-Path 属性内可以指定多个 URL,一个 manifest 文件可以包含多个 Class-Path 属性。

假设本例 EJB 使用了两个第三方类库,名为:Upload.jar,Socket.jar,修改后的 manifest.mf 文件内容如下:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.5.0_01-b08 (Sun Microsystems Inc.)
Class-Path: Upload.jar Socket.jar

注意:Class-Path: 与Upload.jar 之间有一个空格分隔(缺少了空格就会发生找不到 jar 文件),多个 jar 文件之间需要用空格分隔。Class-Path 所在行还需要进行回车换行。

下面是打完包后的目录结构:
EJB 应用根目录
| -- com    (注:ejb 类包)
| -- Upload.jar (注:第三方类库)
| -- Socket.jar (注:第三方类库)
| -- META-INF
     | -- MANIFEST.MF (注:加入了 Class-Path 属性)

----------------------------------------------------------------------------------------------
共用了第三方类库的 J2EE 项目如何打包

     一个 J2EE 项目通常由多个 EJB 和 Web 应用构成,如果多个 EJB 及 Web 应用共用了一个第三方类库,我们又如何打包呢?按照上节介绍的内容,我们会把第三方类库打进每个 EJB Jar 文件及放在 Web 应用的/WEB-INF/lib 目录下。虽然这种方案也能解决问题,但它明显地不够完善。封装 JAR 文件的目的是为了提高应用的模块化程度,把同一个类库放入多个 JAR 文件正好是背其道而行之。此外,多次放置同一个类库无谓地加大了应用的体积。最后,即使只改变一个类库的版权,每一个 EJB
JAR 文件也都要重新构造,从而使构造过程复杂化。

下面的方案很好地解决了上面的问题:
     假设一个 J2EE 项目含有两个 EJB 及一个 Web 应用,他们的文件名分别为:HelloWorld.jar,HelloChina.jar,MyEJBTest.war。这三个模块都使用了一个第三方类库,名为:Tools.jar

    现在我们要做的是编辑这三个模块的 manifest.mf 文件,在原有内容的基础上,添加 Class-Path 属性。
三个模块的 jar 文件修改后的 manifest.mf 文件内容如下:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.5.0_01-b08 (Sun Microsystems Inc.)
Class-Path: Tools.jar

注意:Class-Path: 与 Tools.jar 之间有一空格分隔(缺少了空格就会发生找不到 jar 文件),Class-Path 所在行还需要进行回车换行。

各个模块通过 manifest.mf 文件都能找到其所依赖的 Tools.jar 文件。
下面是打完包后的目录结构:

把第三方类库和 EJB 模块并排打进 jar 包,如果第三方类库很多的情况下,显的有些零乱而不雅观。在此作者建议大家建个文件夹专门用来存放第三方类库。如建个 lib 文件夹,把第三方类库放在此文件夹下。然后修改 J2EE各模块的 manifest.mf 文件内容,修改后的内容如下:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.5.0_01-b08 (Sun Microsystems Inc.)
Class-Path: lib/Tools.jar

J2EE 应用的文件后缀为ear, 应用使用到的各模块在 application.xml 文件中定义,本例的 application.xml 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/j2ee" version="1.4"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://java.sun.com /xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">
        <display-name>EJB3Trail</display-name>
        <description>J2EE Made Easy Trail Map</description>
        <module>
            <ejb>HelloWorld.jar</ejb>
        </module>
        <module>
            <ejb> HelloChina.jar</ejb>
</module>
        <module>
                <web>
                        <web-uri>MyEJBTest.war</web-uri>
                        <context-root>MyEJBTest</context-root>
                </web>
        </module>
</application>

因为 EJB 打进了 EAR 文件,在访问 EJB 时,JNDI 名应为以下格式:
访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
访问远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
  
例:如果上面 J2EE 应用打成 MyJ2EE.ear 文件,访问 HelloWorld EJB 远程接口的 JNDI 名是:
MyJ2EE/HelloWorldBean/remote

抱歉!评论已关闭.