背景
为了方便实施运维同事的部署工作,以前项目都是直接构建一个jar包,现在需要将配置文件、相关说明文档等暴露出来,供实施同事修改。
方法
- 首先使用maven-jar-plugin插件,可以把整个项目打成一个jar包;
- 使用maven-dependency-plugin插件,可以把刚刚打的jar中的依赖jar包全部复制出来到我们自定义的文件夹中;
- 最后使用maven-assembly-plugin插件,来自定义我们希望的文件结构即可。
maven配置
<build>
<defaultGoal>compile</defaultGoal>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.outputDirectory}</targetPath>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<!-- 配置资源文件的打包路径 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 可选配置 -->
<configuration>
<source>1.8</source>
<!-- 源代码使用的JDK版本 -->
<target>1.8</target>
<!-- 生成的目标class文件的JDK编译版本 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
<!-- 排除不需要打进jar包的文件,也就是config目录中的文件 -->
<excludes>
<include>application.yml</include>
<include>application-dev.yml</include>
<include>application-sit.yml</include>
<include>application-prod.yml</include>
<include>logback.xml</include>
</excludes>
<archive>
<!-- 程序入口,即main函数 -->
<manifest>
<mainClass>com.tcm.syndrome.scale.TcmSyndromeScaleApplication</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
<manifestEntries>
<Class-Path>config/ .</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- 把jar复制到target目录下的lib目录下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- ${project.build.directory}就是我们通常看到的target目录 -->
<outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 跳过测试编译 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<!-- 添加MAVEN提供的ASSEMBLY插件,默认使用spring-boot-maven-plugin打包,将项目所有的依赖打入到项目的JAR包里-->
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!--绑定到MAVEN的操作类型上-->
<phase>package</phase>
<!--仅仅运行一次-->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
assembly配置
<assembly>
<!--
ID标签必须指定,ID会追加到打包的名字的末尾,项目名为:servicex-test-0.0.1-SNAPSHOT,
打包后的名字为:servicex-test-0.0.1-SNAPSHOT-bin.tar.gz
-->
<id>bin</id>
<!-- 打包文件的类型,如果要输出多个类型的打包文件,则定义多个 -->
<formats>
<format>tar.gz</format>
<format>tar</format>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<!--文件复制与设置-->
<fileSets>
<!--
0755: 即用户具有读/写/执行权限,组用户和其它用户具有读写权限;
0644: 即用户具有读写权限,组用户和其它用户具有只读权限;
-->
<!-- 1. 将src/main/resources/bin目录下的所有文件输出到打包后的bin目录中 -->
<fileSet>
<directory>src/main/resources/bin</directory>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
<!--如果是执行脚本,一定要改为unix,否则当在windows上面时,脚本会出现dos编写问题-->
<lineEnding>unix</lineEnding>
<!-- 是否进行属性替换 -->
<filtered>true</filtered>
</fileSet>
<!-- 2. 将src/main/assembly/sql目录下的所有文件输出到打包后的sql目录中 -->
<fileSet>
<directory>src/main/resources/sql</directory>
<outputDirectory>sql</outputDirectory>
<fileMode>0644</fileMode>
</fileSet>
<!-- 3. 将src/main/resources下配置文件打包到config目录 -->
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>/config</outputDirectory>
<includes>
<include>*.yml</include>
<include>*.xml</include>
</includes>
<!-- 是否进行属性替换 -->
<filtered>true</filtered>
</fileSet>
<!-- 4. 将项目启动JAR打包到lib目录中 -->
<fileSet>
<directory>target/${project.artifactId}/lib</directory>
<outputDirectory>lib</outputDirectory>
</fileSet>
<fileSet>
<directory>target/${project.artifactId}</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>/src/main/resources/doc</directory>
<outputDirectory>/doc</outputDirectory>
<includes>
<include>*.md</include>
</includes>
<fileMode>0644</fileMode>
</fileSet>
<!-- 5. 将项目说明文档打包到doc目录中 -->
<fileSet>
<directory>.</directory>
<outputDirectory>/doc</outputDirectory>
<includes>
<include>*.md</include>
</includes>
<fileMode>0644</fileMode>
</fileSet>
</fileSets>
</assembly>