IDEA 使用 maven 进行多模块项目打包,并整理出正确的打包顺序
最编程
2024-07-18 14:08:18
...
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。
以上希望对大家有帮助。
如果转载请标明出处。