Maven 3 - 打包 EJB, EAR
Ear 的打包
Ear 的打包分成兩階段, 第一個打包各個 ejb, 第二是把各個 ejb 加上 library 打包成 ear. 打包 ejb 的部分相對簡單, 如下. 最後會打包出 app-ejb1.jar (依據 finalName 的設定) 這個 ejb 檔案.
EJB Client
generateClient 是指定要產生一個 app-ejb1-client.jar 的檔案, 不過如果只加 generateClient 而沒有任何其他參數, 預設是只會過濾某幾個 pattern 而已, 請再加上 clientIncludes, clientExcludes 來過濾. 詳情可參考
- http://maven.apache.org/plugins/maven-ejb-plugin/examples/generating-ejb-client.html
- http://maven.apache.org/plugins/maven-ejb-plugin/examples/ejb-client-dependency.html
1 <build>
2 <plugins>
3 <plugin>
4 <groupid>org.apache.maven.plugins</groupid>
5 <artifactid>maven-compiler-plugin</artifactid>
6 <version>2.3.2</version>
7 <configuration>
8 <source></source>1.6
9 <target>1.6</target>
10 </configuration>
11 </plugin>
12 <plugin>
13 <groupid>org.apache.maven.plugins</groupid>
14 <artifactid>maven-ejb-plugin</artifactid>
15 <version>2.3</version>
16 <configuration>
17 <ejbversion>2.1</ejbversion>
18
19 <generateclient>true</generateclient>
20 </configuration>
21 </plugin>
22 </plugins>
23 <finalname>app-ejb1</finalname>
24 </build>
打包 ear 檔的部分則要注意一下. 首先是要設定好 dependency 如下, 注意雖然上面打包的 ejb 其副檔名是 .jar, 但這裡的 type 必須設定成 ejb
1 <dependencies>
2 <dependency>
3 <groupid>com.yourcompany</groupid>
4 <artifactid>app-ejb1</artifactid>
5 <version>1.0</version>
6 <type>ejb</type>
7 </dependency>
8 <dependency>
9 <groupid>com.yourcompany</groupid>
10 <artifactid>app-ejb2</artifactid>
11 <version>1.0</version>
12 <type>ejb</type>
13 </dependency>
14 </dependencies>
打包 ear 的設定要注意幾個地方:`
- 雖然 dependency 已經有指定了, 但是 ejb 還是要在 ejbModule 的地方再指定一次, 不同的是, 這裡不用指定 version 和 type, 不過要指定 bundleFileName, 這個是 ejb 最後會使用的檔案名字.
- 請記得設定 defaultLibBundleDir, 這樣會把用到的 library 放到 APP-INF/lib (預設是通通放在跟目錄, 和 ejb 混在一起, 那就沒用了)
- 如果有特別的檔案要直接放進來, 可以用 jarModule`
1 <build>
2 <finalname>app-ear</finalname>
3 <plugins>
4 <plugin>
5 <groupid>org.apache.maven.plugins</groupid>
6 <artifactid>maven-ear-plugin</artifactid>
7 <version>2.5</version>
8 <configuration>
9 <generateapplicationxml>true</generateapplicationxml>
10 <defaultlibbundledir>APP-INF/lib</defaultlibbundledir>
11 <modules>
12 <ejbmodule>
13 <groupid>com.yourcompany</groupid>
14 <artifactid>app-ejb1</artifactid>
15 <bundlefilename>app-ejb1.jar</bundlefilename>
16 </ejbmodule>
17 <ejbmodule>
18 <groupid>com.yourcompany</groupid>
19 <artifactid>app-ejb2</artifactid>
20 <bundlefilename>app-ejb2.jar</bundlefilename>
21 </ejbmodule>
22
23 </modules>
24 </configuration>
25 </plugin>
26 </plugins>
27 </build>
最後 app-ear 的結構如下
├── app-ejb1.jar
├── app-ejb2.jar
└── WEB-INF
└── lib
├── log4j-xxxx.jar
├── axis-xxxxjar
└── jdbc-xxxx.jar
如果要把 war 也放進來, 使用 webModule 即可, 如下. 要注意的是, 原來的 war 裡面的 contextRoot 會失去作用, 如果要指定, 請在 webModule 裡面新增一個
1 <modules>
2 <webmodule>
3 <groupid>artifactGroupId</groupid>
4 <artifactid>artifactId</artifactid>
5 <contextroot>/custom-context-root</contextroot>
6 </webmodule>
7 </modules>
目前的 ear 並沒有把 war 打包進去, 如果要打包也很簡單, 在 ear 的 pom 加上一段 warModule 就可以了. 基本上沒有什麼問題, 可以改進的地方只有, 如果 ear 和 war 有共用的 .jar 檔, 那就會重複打包. 可參考 Creating Skinny WARs
注意
- 如果有使用 JPA, 而這個 JPA 是放在 EJB 或某個共用的 jar, 納在包成 EAR 的時候就要注意, 如果這個 jar 會同時出現在 war 的 WEB-INF/lib 以及 ear 的 APP-INF/lib, 那就會出現 duplicate persistence units with name 的錯誤. 解法:
- ejb 會重複出現, 解法:無, 但似乎沒什麼影響