maven多模塊打包一般相互之間都有互相的依賴關係,如果沒有按照正確的依賴關係順序進行打包就會報錯。
例如有三個模塊web、service、common。其中web依賴service。web和service都依賴common,那麼正確的打包順序就是:
common->service->web。
否則就會報錯。
如果用一個父目錄包含他們三個模塊的話,可以用
maven-assembly-plugin
進行統一打包。統一打包需要在父目錄中增加pom文件,並且在pom.xml註明包含關係。如:
<modelVersion>4.0.0</modelVersion>
<groupId>cn.com.leonado</groupId>
<artifactId>test</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>web</module>
<module>service</module>
<module>common</module>
</modules>
這樣在maven進行統一打包的時候就會先進行父模塊的打包後進行子模塊的打包。子模塊之間的打包順序是根據pom.xml文件中的引用依賴順序來決定的。以下爲我的依賴順序
web模塊pom.xml引用
<dependency>
<groupId>cn.com.leonado</groupId>
<artifactId>service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.com.leonado</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
service模塊pom.xml引用
<dependency>
<groupId>cn.com.leonado</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
這樣的打包順序就變成common->service->web的順序。如果要進行打包成可運行的安裝包形式就需要在maven-assembly-plugin插件中引用打包腳本。一般打包腳本卸載最外層的pom.xml中。
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>leonado-test</finalName>
<descriptors>
<descriptor>/assembly-win64zip.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>distro-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
打包腳本示例,打包腳本目錄位置爲web模塊的根路徑下:
<?xml version="1.0" encoding="utf8"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<!-- 產生zip文件的名字 -->
<id>LEONADO_TEST_APIDemo(Java版)</id>
<formats>
<format>zip</format>
</formats>
<!-- 將全部依賴放到/lib目錄下 -->
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
</dependencySet>
</dependencySets>
<!-- 根目錄下的默認bin,config,init,web四個目錄會被添加到tar中 -->
<fileSets>
<!-- jdk 目錄 C:\Program Files\Java\jre7-->
<fileSet>
<directory>/home/build/pki/jdk/jdk1.8.0_111/jre</directory>
<!--<directory>C:\Program Files\Java\jdk1.8.0_51\jre</directory>-->
<outputDirectory>/jre-1.8</outputDirectory>
<includes>
<include>**</include>
</includes>
</fileSet>
<!--構建bin目錄 -->
<fileSet>
<directory>windows</directory>
<outputDirectory>/bin</outputDirectory>
<includes>
<include>*.bat</include>
</includes>
</fileSet>
<!--構建log目錄 -->
<fileSet>
<directory>log</directory>
<outputDirectory>/log</outputDirectory>
<includes>
<include>**</include>
</includes>
</fileSet>
<fileSet>
<directory>script</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>**</include>
</includes>
</fileSet>
<!-- 構建跟目錄 -->
<fileSet>
<directory>${basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>config.ini</include>
<include>logback.xml</include>
</includes>
</fileSet>
</fileSets>
<!--打包文件將依賴模塊打成的jar放到lib依賴目錄中-->
<files>
<file>
<source>../common/target/common-2.0.jar</source>
<outputDirectory>/lib</outputDirectory>
<destName>common-2.0.jar</destName>
</file>
<file>
<source>../service/target/service-2.0.jar</source>
<outputDirectory>/lib</outputDirectory>
<destName>service-2.0.jar</destName>
</file>
</files>
</assembly>
最終打包結果爲:
所有的依賴包全部打包到lib下,包括web.jar、service.jar、common.jar。
以上希望對大家有幫助。
如果轉載請標明出處。