通过assembly自定义maven打包方式

通过assembly自定义maven打包方式

前言

最近要统一打包输出的格式,结构如下:

通过assembly自定义maven打包方式

为了实现SpringBoot自动打包成图中的格式,这次用assembly以手动修改POM添加脚本的方式实现自动打包

准备

首先POM中需要引入如下代码:

<!--jar生成-->
<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
</plugin>
<!--自定义打包配置-->
<plugin>
     <artifactId>maven-assembly-plugin</artifactId>
     <executions>
          <execution>
               <phase>package</phase>
               <goals>
                    <goal>single</goal>
               </goals>
               <configuration>
                    <!--finalName用于配置最后生成的文件名 -->
                    <finalName>${project.artifactId}-${project.version}</finalName>
                    <!--生成包的末尾添加assembly id,一般关闭 -->
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                         <!--加载指定的配置文件-->
                         <descriptor>src/assembly/assembly-descriptor.xml</descriptor>
                    </descriptors>
               </configuration>
          </execution>
     </executions>
</plugin>

其中maven-compiler-plugin是用来将代码生成jar的工具,maven-assembly-plugin是用来生成指定格式的工具。

配置完成后进入标签里指定的位置建xml文件,这里是src/assembly/assembly-descriptor.xml,内容如下:

<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>my-assembly</id>
	<formats>
          <!--打包生成后的格式 -->
		<format>zip</format>
	</formats>
     <!-- -->
	<includeBaseDirectory>false</includeBaseDirectory>
	<fileSets>
		<fileSet>
               <!--脚本所在的文件夹,以及打包后将脚本输出到哪个文件夹中 -->
			<directory>src/scripts</directory>
			<outputDirectory>alarm/bin</outputDirectory>
               <!-- 哪些文件会被提取 -->
			<includes>
				<include>*.sh</include>
			</includes>
               <!-- 文件权限及编码 -->
			<fileMode>0755</fileMode>
			<lineEnding>unix</lineEnding>
		</fileSet>
		<fileSet>
               <!--同上,这里配置的是配置文件所在的文件夹 -->
			<directory>src/main/resources</directory>
			<outputDirectory>alarm/conf</outputDirectory>
			<includes>
				<include>*.yml</include>
			</includes>
			<lineEnding>unix</lineEnding>
		</fileSet>
		<!--artifact -->
		<fileSet>
               <!--这里的target是maven-compiler-plugin生成该项目的jar包的位置 -->
			<directory>target</directory>
			<outputDirectory>alarm/lib</outputDirectory>
			<includes>
				<include>*.jar</include>
			</includes>
			<fileMode>0755</fileMode>
		</fileSet>
	</fileSets>

	<dependencySets>
		<dependencySet>
               <!--这里是将该项目依赖的所有jar包存入lib文件夹中 -->
			<outputDirectory>alarm/lib</outputDirectory>
			<useProjectArtifact>false</useProjectArtifact>
			<useProjectAttachments>true</useProjectAttachments>
			<scope>runtime</scope>
		</dependencySet>
	</dependencySets>

</assembly>

启动脚本

在完成以上配置后,只需在指定的位置建立scripts/start.sh和stop.sh两个脚本即可完成。具体启动脚本如下:

#!/bin/sh
basepath=$(cd `dirname $0`;cd '../'; pwd)
echo "path:"$basepath
jarHome='/my.jar'
echo "Starting my service"
ls_date=`date +%Y%m%d`
if [ ! -d "${basepath}/log" ]; then
  mkdir ${basepath}/log
fi
if [ ! -d "$basepath/log/${ls_date}" ]; then
  mkdir $basepath/log/${ls_date}
fi
nohup java -jar $basepath$jarHome --spring.config.location=$basepath/conf/server-attach.yml,$basepath/conf/server-shared.yml> $basepath/log/${ls_date}/${ls_date}.log &
#####

主要命令是获取当天日期,然后在log文件夹下建立指定日期的文件夹,并将日志存放进去。其中–spring.config.location用于加载指定的配置文件,多个配置文件用逗号分割。

停止脚本通过ps -ef获取进程id然后kill,如下:

#!/bin/sh
my=`ps -ef |grep my.jar | grep -v grep | awk '{print $2}'`
kill -9 $my

结语

以上配置完成后使用mvn package命令即可自动打成一个zip压缩包,包内包含bin、conf、lib文件夹,可用启动脚本一键启动。实际上这里能修改的地方还有很多,包括启动脚本也可以用其他方式如java -classpath方式启动等等,具体的可以根据自身需求进行相应修改。