针对新手的Java EE7和Maven项目-第4部分-定义Ear模块
從前面的部分恢復
第1部分
第2部分
第3部分
我們正在恢復第四部分,目前我們的簡單項目有
- Web Maven模塊(戰爭)
- 一個ejb模塊(ejb),其中包含我們的無狀態會話bean(EJB 3.1)
- 第二個(ejb)模塊包含我們的實體bean(JPA2)
但是我們仍然缺少將它們打包的所有文件,即“ 耳朵”類型的文件(也稱為Enterprise Archive) 。
定義我們的耳朵Maven模塊
正如您在下圖中所看到的,我們在sample-parent下創建了一個名為sample-ear的emtpy文件夾。 該文件夾需要有一個pom.xml文件。 我們的新模塊需要在sample-parent \ pom.xml的“ 模塊 ”部分中正確引用。
我們的ear Maven模塊的主要目的是“配置”著名的maven-ear-plugin ,它將由maven調用并將產生最終的可部署應用程序。
我們需要做2件事,添加maven-ear-plugin的配置,并在ear模塊上添加我們的“ internal ”應用程序依賴項,以便它“知道”應該查找哪些模塊。 我們來看一下:
內耳pom.xml
<build><finalName>sampleapp</finalName><plugins><!--Ear plugin -creating the ear - watch out skinny WARS!--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-ear-plugin</artifactId><configuration><finalName>sampleapp</finalName><defaultJavaBundleDir>lib/</defaultJavaBundleDir><skinnyWars>true</skinnyWars><modules><webModule><groupId>gr.javapapo</groupId><artifactId>sample-web</artifactId></webModule><ejbModule><groupId>gr.javapapo</groupId><artifactId>sample-services</artifactId></ejbModule></modules></configuration></plugin></plugins></build>這是構建部分,請注意以下事項:
- 請記住,因為我們沒有其他模塊,我們定義了一些基本的常用的配置為我們的插件,在“ 父 ” POM。 返回并查看已經為您準備的內容。
- 請注意“ defaultJavaBundleDir ”,在這里我們定義所有庫的位置(除了將駐留在我們耳朵中的頂級模塊之外,通常是耳朵中的一個子文件夾,稱為“ lib”)。
- 什么是頂級模塊? 實際上,是將瓶子和戰爭包裝在耳朵里,被認為是第一級公民,正如您所看到的,我們定義了2,樣本網絡和樣本服務。
- 注意“ skinnyWars ”屬性。 啟用此開關后, 我們將根據我們的war項目引用的第三方庫強制執行某種打包模式 。 簡而言之,我們的戰爭歸檔文件不會在WEB-INF \ lib文件夾下包含任何我們可能定義為依賴項的外部庫,而是所有這些庫,它們將被包裝在耳邊的“ defaultJavaBundleDir ”路徑中。
如果不添加耳掛的“依賴關系”部分,以上配置將無法正常工作。
<!-- our in app dependencies--><dependencies><dependency><groupId>gr.javapapo</groupId><artifactId>sample-web</artifactId><version>${project.version}</version><type>war</type></dependency><dependency><groupId>gr.javapapo</groupId><artifactId>sample-services</artifactId><version>${project.version}</version><type>ejb</type></dependency></dependencies>記下以下內容:
- 此pom中的dependency元素需要'type'屬性。
您可能有一個很好的問題,樣本域(jar)模塊在哪里?
嗯,這個模塊在我們的耳邊不會被提升為頂層元素,因為我們將其添加為對sample-services模塊的依賴。 因此,我們的服務將依賴于實體bean的模塊。 (聽起來很公平)。 因此,我們需要更新示例服務模塊的pom.xml。
<artifactId>sample-services</artifactId><name>sample-services</name> <description>EJB service layer</description><packaging>ejb</packaging><dependencies><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId></dependency><dependency><groupId>gr.javapapo</groupId><artifactId>sample-domain</artifactId><version>${project.version}</version></dependency></dependencies></project>通過這樣做,sample-services.jar將沿著sample-domain.jar“獲取”。 默認情況下(請記住,Maven都是關于約定的),當我們為耳朵定義一個頂級模塊時,就像樣本服務一樣,它的依賴項會自動捆綁在耳朵的defaultJavaBundleDir庫下! 因此,當我們打包耳朵時,我們將期望看到打包的sample-domain jar。
再缺少一個依賴
在服務模塊和實體模塊之間的第一個應用程序內依賴之后,我們需要另一個。 我們的戰爭模塊(Web層)將使用我們的一些服務,但是為了能夠做到這一點,需要依賴于“服務”模塊。 因此,我們需要相應地在sample-web項目上使用pom.xml。
<packaging>war</packaging><build><finalName>${project.artifactId}</finalName></build><dependencies><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><scope>provided</scope></dependency><dependency><groupId>gr.javapapo</groupId><artifactId>sample-services</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>讓我們打包戰爭吧。
現在我們已經準備好,已經設置了基本依賴項,已經配置了我們的耳朵,只需要打包即可。 在命令行的sample-parent文件夾級別下,我們只需要輸入:
mvn清潔包裝
我們完成了,讓我們檢查sample-ear模塊的“ target”文件夾下。 我們的最后一只耳朵已經準備好了,maven還創建了耳朵的“ 分解 ”版本(在下圖中展開)。 注意我們的兩個頂級耳朵元素,以及sample-domain.jar如何位于我們耳朵的“ lib”文件夾下。 還請注意,lib文件夾中未包含某些基本庫,例如javaee-api.jar。 由于我們已經在pom中添加了提供的內容。 (請參閱xml的最終版本)。
最后一件事……皮包骨頭的戰爭和MANIFEST.MF文件
最終,我們可以在這里停下來,我們的最后一只耳朵可以正常工作,但是在上述所有配置下,尤其是在我們偏好進行皮包骨頭的戰爭的情況下,我們需要注意一個小細節。 MANIFEST文件是jar和wars中的特殊描述符,供應用程序服務器在耳朵內的類路徑中查找和類加載“相關” jar時使用。
我們的小問題存在于sample-web.war的MANIFEST.MF文件中。 如果解壓縮生成的war文件,并使用文本編輯器MANIFEST.MF打開,我們將看到類似的內容。
Manifest-Version: 1.0Built-By: papoBuild-Jdk: 1.7.0_45Class-Path: lib/sample-services-0.0.1-SNAPSHOT.jar lib/sample-services-0.0.1-SNAPSHOT.jar lib/sample-domain-0.0.1-SNAPSHOT.jarCreated-By: Apache Maven 3.2.1Archiver-Version: Plexus Archiver你能發現錯誤嗎? 默認情況下,生成的MANIFEST.MF為我們的頂級ejb jars(sample-services)指示錯誤的路徑。 我們的sample-services.jar不在耳朵的\ lib下,而是頂級元素。 那么我們如何創建正確的清單?
最終,我們需要對Maven-war插件進行一些微調。 我們需要覆蓋父pom中指定的默認行為,并為此特定依賴項指定正確的條目。 如果碰巧有多個jar,則需要在配置中附加所有作為頂級元素的jar(確保正確執行,在條目之間使用空格)。因此在sample-war pom中,我們需要在所應用的配置之上添加一些配置(額外)。 參見下圖。
有一個有趣的stackoverflow問題 ,您可以有關此的知識,小技巧或其他可能的解決方法,以防您使用骨瘦如柴的戰爭。
就是這樣,我們的耳朵已經準備好了。
摘要
您可以在Git Tag中找到此文章的最終版本。本文將完成從頭開始,應用基本的Maven原理并為Java企業應用程序創建一些基本的Maven模塊的系列文章。 請隨意重用此示例并對其進行擴展,以滿足您自己的需求。 就滿足您的所有需求而言,它是完整的,但它是在Maven中入門,思考和配置的可靠示例。
我將在此示例中進行擴展,在以后的文章中添加更多的模塊并使用maven的更多功能。
翻譯自: https://www.javacodegeeks.com/2014/06/java-ee7-and-maven-project-for-newbies-part-4-defining-the-ear-module.html
總結
以上是生活随笔為你收集整理的针对新手的Java EE7和Maven项目-第4部分-定义Ear模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后羿操作设置(后羿操作设置怎么调)
- 下一篇: 如何在Java中找到整数的质因数–因式分