pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>maven-build-tar</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<env>sit</env>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies>
<build>
<finalName>maven-build-tar</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- 排除掉不想打包到jar包中的文件 -->
<excludes>
<exclude>*.properties</exclude>
<exclude>*.yaml</exclude>
<exclude>*.yml</exclude>
<exclude>*.xml</exclude>
<exclude>env/**</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<descriptors>
<!-- 描述文件路径 -->
<descriptor>src/main/script/assembly.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>com.example.Application</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly-local</id><!--名字任意 -->
<phase>package</phase><!-- 绑定到package生命周期阶段上 -->
<goals>
<goal>single</goal><!-- 只运行一次 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
assembly.xml
<assembly>
<id>${project.version}</id><!--名字 会附加在版本后面-->
<formats>
<format>zip</format><!--打包格式,有zip、tar、tar.gz、jar、war等-->
<format>tar</format>
</formats>
<!--如果为false,不会额外产生根目录,否则,在打好的包中会产生以pom.xml中artifactId和version命名的根目录-->
<includeBaseDirectory>true</includeBaseDirectory>
<!--是对依赖包的设置-->
<dependencySets>
<!--assembly中dependencySets的意思就是,将scope为runtime的依赖包,放到AlarmReport/lib目录下-->
<dependencySet>
<!--定义了是否解压依赖包,如果为true,会解压出依赖包中的class文件,反之,则不进行解压-->
<unpack>false</unpack>
<!--限定了对哪些依赖包进行操作;(依赖包scope的值是在pom.xml中定义的)-->
<scope>runtime</scope>
<!-- 依赖包在打好的包中相对于根目录的路径-->
<outputDirectory>lib</outputDirectory>
<!--依赖包中是否包含当前工程-->
<useProjectArtifact>true</useProjectArtifact>
</dependencySet>
</dependencySets>
<!--指定哪些文件包含在打出的打好的包中-->
<fileSets>
<!-- 把项目相关的说明文件,打包进根目录 -->
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,打包进/conf目录 -->
<fileSet>
<directory>target/classes/env/${env}</directory>
<outputDirectory>conf</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.pem</include>
<include>*.text</include>
<include>*.yml</include>
<include>*.yaml</include>
<include>*.xml</include>
<include>*.env</include>
</includes>
</fileSet>
<!-- 把项目的环境配置文件,打包进/env目录 -->
<fileSet>
<directory>target/classes/env</directory>
<outputDirectory>env</outputDirectory>
</fileSet>
<!-- 启停脚本,打包进/bin目录 -->
<fileSet>
<directory>src/main/script/bin</directory>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进/apps目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>apps</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
application.properties
env=local|dev|prod
com.example.Application.java
package com.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
/**
* 打包命令
* mvn -U clean package assembly:assembly -Dmaven.test.skip=true -Denv=prod
*/
@SpringBootApplication
public class Application implements ApplicationRunner {
@Value("${env}")
public String key;
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(WebApplicationType.NONE).run(args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("--------------maven-build-tar--------------env: " + key);
}
}
运行打包的命令
mvn -U clean package assembly:assembly -Dmaven.test.skip=true -Denv=dev|prod
目录结构
参考:
SpringCloud项目整合assembly插件打tar包_铁汉柔情li的博客-CSDN博客_springcloud 打包插件