一个 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
Main-Class: test.Main
Class-Path: ./ ./lib/commons-collections-3.2.jar ./lib/commons-dbcp-1.2.2.jar
./lib/commons-lang-2.3.jar ./lib/commons-logging-1.1.jar
================================================================================
各部分解释:
Manifest-Version MF文件版本号
Main-Class 包含main方法的类
Class-Path 执行这个jar包时的ClassPath
以下是需要注意的各个要点:
1. Manifest-Version、Main-Class和Class-Path后面跟着一个英文的冒号,冒号后面必须跟着一个 空格,然后才是版本号、类和ClassPath。
2. Class-Path中的各项应使用 空格分隔,不是逗号或分号。
3. Class-Path中如果有很多项,写成一行打包的时候会报错line too long,这时需要把Class-Path分多行写。注意:从第二行开始,必须以 两个空格开头,三个以上我没试过,不过不用空格开头和一个空格开头都是不行的,我已经试过了。
4. Class-Path写完之后最后一定要有一个 空行。
5. jar包内有些配置文件想放在jar包外面,比如文件config.properties:如果这个文件是以路径方式载入的,比如new file("./config/config.properties"),那么将config.properties放在jar包相同目录下的config目录下即可,也就是说“./”路径等价于jar包所在目录;如果这个文件是以ClassPath下的文件这种方式载入的,比如在Spring中载入classpath:config.properties,则在MF文件的配置文件的ClassPath中添加“./”,然后将这个配置文件与jar包放在同一个目录即可,当然也可以在MF文件的配置文件的ClassPath中添加“./config/”,然后把配置文件都放在jar包相同目录下的config目录下。
注意:Class-Path: 与 Tools.jar 之间有一空格分隔(缺少了空格就会发生找不到 jar 文件),Class-Path所在行还需要进行回车换行。
各个模块通过 manifest.mf 文件都能找到其所依赖的 Tools.jar 文件。
。
在此作者建议大家建个文件夹专门用来存放第三方类库。如建个lib 文件夹,把第三方类库放在此文件夹下。然后修改 J2EE各模块的 manifest.mf 文件内容,修改后的内容如下: