在用IDEA構(gòu)建maven多module項目時,碰到了一些問題,現(xiàn)在歸納總結(jié)如下阱佛。
假如一個maven項目下分為幾個module帖汞,分別是不同的服務(wù),以及common模塊凑术,結(jié)構(gòu)如下:
shopping
├── common
├── mail-service
├── order-service
└── pay-service
則shopping pom大概率是如下內(nèi)容:
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.shop</groupId>
<artifactId>shopping</artifactId>
<version>0.0.1</version>
<modules>
<module>mail-service</module>
<module>pay-service</module>
<module>order-service</module>
<module>common</module>
</modules>
<packaging>pom</packaging>
common pom的內(nèi)容大概如下:
<parent>
<groupId>com.test.shop</groupId>
<artifactId>shopping</artifactId>
<version>0.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common</artifactId>
<version>0.0.7</version>
<packaging>jar</packaging>
<distributionManagement>
<repository>
<id>nexus</id>
<name>Releases</name>
<url>http://192.168.1.17:8081/repository/maven-releases</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>Snapshot</name>
<url>http://192.168.1.17:8081/repository/maven-snapshots</url>
</snapshotRepository>
</distributionManagement>
pay-service和order-service的pom會依賴common:
<dependency>
<groupId>com.test.shop</groupId>
<artifactId>common</artifactId>
<version>0.0.7</version>
</dependency>
因為pay-service和order-service依賴common模塊(此時如果是在開發(fā)和測試階段是不需要將common發(fā)布到maven私服倉庫的翩蘸,但如果要打包必需發(fā)布common),如果要單獨打包pay-service或order-service淮逊,則需要將common發(fā)布到maven私服倉庫催首。在common模塊下執(zhí)行 mvn deploy
將common發(fā)布到倉庫,此時僅僅將common發(fā)布到了倉庫泄鹏,但由于common依賴其parent - shopping pom翅帜,而shopping pom并沒有并發(fā)布到倉庫,所以導(dǎo)致在打包pay-service或order-service時失敗命满。
問題總結(jié)成一句話:在發(fā)布子module時涝滴,如果依賴parent的pom,那在deploy到倉庫時胶台,要將parent pom也發(fā)布到倉庫歼疮,否則會因為找不到parent pom而無法打包。
解決這個問題有兩種選擇:
- 在parent的pom下執(zhí)行deploy, 這樣就會自動將parent pom以及sub module都發(fā)布到倉庫诈唬。
- 或者將子module的parent去掉韩脏,不要依賴不在倉庫中的pom,將子module提升為一個獨立的maven項目單獨發(fā)布铸磅。
這里我選擇第一種方式:在parent pom下執(zhí)行deploy赡矢,這樣如果有多個了module需要部署到倉庫也更方便。
將common pom中的 distributionManagement 刪掉阅仔,在shopping pom中添加 distributionManagement:
<distributionManagement>
<repository>
<id>nexus</id>
<name>Releases</name>
<url>http://192.168.1.17:8081/repository/maven-releases</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>Snapshot</name>
<url>http://192.168.1.17:8081/repository/maven-snapshots</url>
</snapshotRepository>
</distributionManagement>
此時在shopping目錄下執(zhí)行 mvn deploy
就會將shopping吹散、common、pay-service以及order-service都發(fā)布到maven倉庫八酒,但如果只想發(fā)布shopping和common怎么辦空民?
問題總結(jié)成一句話:parent pom在deploy時,默認會將所有子module都deploy到倉庫中羞迷,如果不想讓某個子module部署到倉庫界轩,可以在子module的pom中添加:
<properties>
<maven.deploy.skip>true</maven.deploy.skip>
</properties>
在pay-service和order-service pom中添加如上屬性,再deploy就不會發(fā)布這兩個模塊到倉庫了衔瓮。
Spring boot maven plugin問題
在打包spring boot項目時浊猾,需要使用如下插件:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
如果在用maven構(gòu)建多模塊項目時,不要將此插件放到parent pom中热鞍,否則如果有sub module不是spring boot應(yīng)用葫慎,在打包時就會出錯衔彻。只將該插件添加到是spring boot項目的子模塊。上面例子中common模塊不是spring boot應(yīng)用就不需要此插件幅疼,故不要將此插件放到shopping pom中米奸。
https://stackoverflow.com/questions/7446599/how-to-deploy-only-the-sub-modules-using-maven-deploy