我在一個多模塊Maven項目中轉換單個Eclipse Maven託管的webapp項目(這是一個用Maven實驗的測試項目,所以請隨時提供任何類型的建議)。Maven多模塊:組裝錯誤WAR:需要webxml屬性
單個項目webapp沒有任何錯誤,在部署時成功編譯並且行爲正確,所以我從一個可用的應用程序開始。
該應用程序有一個Web部件和一個控制檯部分,這意味着有一些類有一個main()
方法,當從Eclipse內部運行時(Run as - > Java Application)按預期工作。兩個部分均顯示來自數據庫的數據,通過JDBC直接查詢或通過jOOQ查詢。
所以,我這是怎麼拆分項目:
- 核心(持有共同的一切其他兩個部分);
- 可運行(包含具有
main()
方法的類); - webapp(web應用程序部分)。
在Eclipse,我現在有4個獨立的項目:
shaker-multi
保持聚合器(和親本)POM,加在一個子目錄中的每個模塊;shaker-multi-core
;shaker-multi-runnable
;shaker-multi-webapp
。
在Eclipse中,核心和的webapp編譯,而後者可以部署到Tomcat實例,我可以看到它在瀏覽器中。
問題出現在可運行。該項目依賴於jOOQ類,因此必須生成相關的源代碼。 jOOQ的依賴關係和配置在core/pom.xml
(因爲它們也可能在那裏使用)。
當我做項目 - >運行方式 - > Maven構建... - >clean generate-sources
,在shaker-multi-core
我得到:
Non-resolvable parent POM: Failure to find sunshine.web:shaker-multi:pom:0.0.1
這聽起來很合理,因爲我沒有安裝任何的文物,即使在我的本地存儲庫中。
但是,當我打電話Maven構建... - >上shaker-multi
「乾淨安裝」,它打破了,因爲它無法找到web.xml
文件shaker-multi-webapp
(儘管它正確地駐留在shaker-multi-webapp/src/main/webapp/WEB-INF/web.xml
)。
我該怎麼辦? 我的項目配置/拆分是完全錯誤的嗎? 我應該添加其他模塊與父POM?這聽起來是錯誤的,因爲POM參考指出:
繼承和聚合創建一個很好的動態來控制通過單個高級POM的構建。 你會經常看到父母和聚合者項目。
我完全迷失在這裏。
我的期望:
- 上
shaker-multi-webapp
運行Maven package
並獲得部署戰爭; - 運行
Maven package
onshaker-multi-runnable
並獲得一個可運行的命令行jar(我仍然需要配置它的POM來生成一個jar -with-dependencies,雖然我知道); - 運行
Maven package
上shaker-multi
並獲得某種束的,我可以四處移動,並且將包含戰爭或每個模塊的罐子。
編輯
我加
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
到shaker-multi-webapp
POM,如this answer看到的,但沒有什麼區別。
EDIT 2
我清除了我的整個本地存儲庫(如建議here),當我重新開放的Eclipse,在Maven控制檯只見
[...] 05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/main/java 05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/test/java **05/09/14 07:58:19 CEST: [ERROR] Could not read web.xml** [...]
任何提示?它從哪裏來?我不能重現它(但不刪除我的整個本地回購)。
這是shaker-multi
POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<modules>
<module>shaker-multi-core</module>
<module>shaker-multi-runnable</module>
<module>shaker-multi-webapp</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
這是shaker-multi-core
POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
</parent>
<artifactId>shaker-multi-core</artifactId>
<packaging>jar</packaging>
<build>
<plugins>
<plugin><!-- jOOQ plugin--></plugin>
</plugins>
</build>
<dependencies>
<dependency><!-- jOOQ dependency --></dependency>
</dependencies>
</project>
這是shaker-multi-webapp
POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
</parent>
<artifactId>shaker-multi-webapp</artifactId>
<packaging>war</packaging>
<build>
<plugins>
<plugin><!-- Tomcat local -->
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi-core</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<!-- JSP & Servlet dependencies -->
</dependency>
</dependencies>
</project>
你介意給你的問題/建議添加數字或字母引用,所以我可以在我的評論中引用他們嗎? – watery 2014-09-05 10:47:15
1)感謝您的建議; 2)沒有特別的原因;我對Maven學習採取緩慢的態度; 3),4)和5)這很好!除此之外,我的設置並沒有什麼錯,問題是'shaker-multi'包含聚集器 - 父 - POM旁邊的所有模塊源,而在我的Eclipse工作區中,每個人都有一個單獨的項目子模塊。但是我對單個項目進行了更改,但沒有將它們提交給svn並將它們放回到aggregator-project中,因此對後者的'mvn install'失敗,因爲實際上沒有'web.xml'文件。 – watery 2014-09-05 22:40:51
爲了清晰起見,我會更新我的問題,並儘快爲技術說明添加答案。但你的答案包含preciuos的建議,所以+1是真正值得的! – watery 2014-09-05 22:41:56