编写一个简单的 maven 多模块项目的打包脚本

Posted 毕小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写一个简单的 maven 多模块项目的打包脚本相关的知识,希望对你有一定的参考价值。

背景

Java 应用发布的时候,通常按某种目录结构组织部署包。为了避免每次发布的时候手动拷贝最新的 jar 包,可以利用 maven-assembly-plugin 插件,直接将工程打包成特定目录的 zip 包。

本文介绍一个简单的打包脚本,完成发布一个固定包的功能。

实现步骤

笔者为一个同时包含 modelAmodelB 两个独立应用的多模块项目,编写了一个打包模块,过程如下。

第一步,在父工程下创建一个 maven 项目的新模块,命名为 assembly ,删掉 src 目录。

第二步,在 assembly 目录下创建一个部署包目录,命名为 template ,它的结构类似 tomcat 发布包:

第三步,编写 pom.xml 文件,packaging 类型为 pom ,并添加 maven-assembly-plugin打包插件配置:

<artifactId>assembly</artifactId>
<packaging>pom</packaging>

<build>
    <plugins>
         <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <finalName>XXX-Package</finalName>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <dependencies>

            </dependencies>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

第四步,在 assembly 目录下创建一个打包文件 assembly.xml,在该文件中定义最终部署包的文件来源。这里将模块 A 的可执行 jar 包打入到 lib 目录下,示例脚本如下:

<assembly
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
	<id>full</id>
	<formats>
		<format>zip</format>
	</formats>
	<includeBaseDirectory>false</includeBaseDirectory>

	<!--将部署包目录模板添加到打包目录-->
	<fileSets>
		<fileSet>
			<directory>$basedir/template</directory>
			<outputDirectory>XXX-Package</outputDirectory>
		</fileSet>
	</fileSets>

	<!--将SpringBoot 打包生成的 jar 拷贝到目标文件夹的 lib -->
	<files>
		<file>
			<source>$parent.basedir/modelA/target/madelA.jar</source>
			<outputDirectory>XXX-Package/lib</outputDirectory>
		</file>
	</files>
</assembly>

pom.xml 中的配置 finalName 是最终打包文件名称,执行该打包脚本后生成一个
XXX-Package.zip 文件,就类似我们下载的 Tomcat 压缩包了。

bin 目录

bin 目录下通常是启动和停止脚本。

编写启动脚本 start.sh ,以后台进程且忽略掉输出、指定 Spring 配置文件路径的方式启动 SpringBoot 的可执行 jar 包:

#!/bin/sh
basePath=$(cd `dirname $0`; pwd)
echo "basepath is $basePath"

cd ../lib
nohup java -Xmx512m  -jar xx.jar --spring.config.additional-location=file:../conf/ >/dev/null 2>&1 &

停止脚本页比较简单,找到对应的进程 kill 掉:

jarPid=`ps -ef|grep XXX.jar|grep -v "grep"|awk 'print $2'`
if [ "$jarPid" != "" ]; then   
    kill -9 $jarPid    
fi

打包过程

包含 assembly 的多个模块的打包顺序如下:

由于 assembly 的打包方式 pom ,所以它最后一个执行,可以保证拿到其他模块的 jar 。

启示录

这是个比较简单的应用,maven 的三个插件都对打包有不同的作用,下一章节将继续介绍打包插件的注意事项。

以上是关于编写一个简单的 maven 多模块项目的打包脚本的主要内容,如果未能解决你的问题,请参考以下文章

记Spring搭建功能完整的个人博客「Oyster」全过程[其二] Idea中Maven+SpringBoot多模块项目开发的设计和各种坑(模块间依赖和打包问题)

SpringBoot+Maven 多模块项目的构建运行打包

maven cmd多模块项目,打包某个模块的jar

Java Maven打包总结(Jenkins多模块编译部署)

maven插件--assembly

用maven打包jar项目其中很多模块引用了相同jar包,如何把它些jar公用,让maven打包不把这公用包打进去