写点什么

【Maven 技术专题】如何使用 Assembly 插件实现自定义打包

发布于: 1 小时前
【Maven技术专题】如何使用Assembly插件实现自定义打包

前提概要


最近我们项目越来越多了,然后我就在想如何才能把基础服务的打包方式统一起来,并且可以实现按照我们的要求来生成,通过研究,我们通过使用 maven 的 assembly 插件完美的实现了该需求,爽爆了有木有。本文分享该插件的配置以及微服务的统一打包方式。

maven-assembly-plugin 打包插件

配置步骤及其他事项

首先我们需要在 pom.xml 中配置 maven 的 assembly 插件


<build>    <plugins>      <plugin>        <groupId>org.apache.maven.plugins</groupId>        <artifactId>maven-assembly-plugin</artifactId>        <executions>    <!-- 配置执行器 -->          <execution>            <id>make-assembly</id>      <!-- 绑定到package生命周期阶段上 -->            <phase>package</phase>            <goals>        <!-- 只运行一次 -->              <goal>single</goal>            </goals>            <configuration>              <!--生成包的末尾添加assembly id,一般关闭 -->              <appendAssemblyId>false</appendAssemblyId>              <finalName>${project.artifactId}-${project.version}</finalName>              <!--加载指定的配置文件-->              <descriptors>                  <descriptor>src/main/assembly/assembly.xml</descriptor>              </descriptors>            </configuration>          </execution>        </executions>      </plugin>    </plugins> </build>
复制代码

配置参数介绍说明

  • execution:配置执行器

  • phase:绑定到 package 生命周期阶段上

  • goal:{single}:只运行一次

  • configuration->appendAssemblyId:生成包的末尾添加 assembly id,一般关闭

  • descriptor:src/main/assembly/assembly.xml:后续会讲解,主要用于描述如何进行打包的规则。

自定义格式包 assembly.xml

接着我们在 src/main/assembly 文件中配置 assembly.xml 文件


  <assembly>      <id>唯一编号</id>      <formats>        <!--打包的文件格式,也可以有:war zip-->          <format>tar.gz</format>      </formats>      <!--tar.gz压缩包下是否生成和项目名相同的根目录-->      <includeBaseDirectory>true</includeBaseDirectory>     <fileSets>         <fileSet>             <directory>src/main/bin</directory>             <outputDirectory>/</outputDirectory>       <!-- Linux权限 -->             <fileMode>0644</fileMode>         </fileSet>         <fileSet>      <directory>target/classes/META-INF/conf</directory>            <outputDirectory>conf/META-INF/conf</outputDirectory>      <!-- Linux权限 -->      <fileMode>0644</fileMode>        </fileSet>    <fileSet>      <directory>target/classes</directory>      <outputDirectory>conf</outputDirectory>      <fileMode>0644</fileMode>      <includes><!-- 只负责这些目标文件-->        <include>*.properties</include>        <include>*.xml</include>      </includes>    </fileSet>     </fileSets>     <!-- 输出到lib路径 -->     <dependencySets>          <dependencySet>             <!--是否在最外层套一个本项目的名称的文件目录-->             <useProjectArtifact>true</useProjectArtifact>             <!-- 输出到这个路径下 -->             <outputDirectory>lib</outputDirectory>             <!--将scope为runtime的依赖包打包-->             <scope>runtime</scope>         </dependencySet>     </dependencySets> </assembly>
复制代码


  • 生成的 lib 文件夹下放该项目的所有依赖以及该服务 jar 包,src/main/bin 文件夹下我们一般放 start.sh 和 stop.sh 两个脚本文件用来开启和关闭该服务,打包后直接放到根目录下

  • 生成的 tar.gz 文件的名字为:[maven-assembly-plugin 插件中配置的 finalName]-[assembly.xml 配置的 id(若 assembly 中没有指定 id,则只有前半部分)].


assembly的具体语法,请参见官网:


  • 所以: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 两个脚本即可完成。具体启动脚本如下:

start.sh 启动文件脚本

#!/bin/shbasepath=$(cd `dirname $0`;cd '../'; pwd)echo "path:"$basepathjarHome='/my.jar'echo "Starting my service"ls_date=`date +%Y%m%d`if [ ! -d "${basepath}/log" ]; then  mkdir ${basepath}/logfiif [ ! -d "$basepath/log/${ls_date}" ]; then  mkdir $basepath/log/${ls_date}finohup 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 用于加载指定的配置文件,多个配置文件用逗号分割。

stop.sh 停止文件脚本

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


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

结语

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

发布于: 1 小时前阅读数: 3
用户头像

🏆2021年InfoQ写作平台-签约作者 🏆 2020.03.25 加入

👑【酷爱计算机技术、醉心开发编程、喜爱健身运动、热衷悬疑推理的”极客狂人“】 🏅 【Java技术领域,MySQL技术领域,APM全链路追踪技术及微服务、分布式方向的技术体系等】 我们始于迷惘,终于更高水平的迷惘

评论

发布
暂无评论
【Maven技术专题】如何使用Assembly插件实现自定义打包