一、简介
maven项目打包是我们程序员经常遇到的事,今天就来弄一个常用的打包方式,我们需要的结果是:
- 所有的依赖和源码在一个jar
- 配置文件可以放到指定的位置,比如和jar同级的config目录
- 所有的配置文件不在jar包里,防止敏感信息泄露
我们现有的项目路径结果如下:
二、pom.xml
我这里使用到的版本如下:
groupId | artifactId | version |
---|---|---|
org.springframework.boot | spring-boot-maven-plugin | 2.3.12.RELEASE |
org.apache.maven.plugins | maven-compiler-plugin | 3.8.1 |
org.apache.maven.plugins | maven-jar-plugin | 3.2.0 |
org.apache.maven.plugins | maven-resources-plugin | 3.2.0 |
第一个是SpringBoot的我建议还是去官网找一个比较稳定的版本,固定好,如果没有指定版本,可能你每次打包的时候,都需要花很多时间去下载依赖,尤其网络不好的时候,更糟心,频繁的版本变更,也容易出现不兼容的问题。详细的解释都在pom.xml里了,大家可以仔细阅读。
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/>
</parent>
<groupId>com.alian</groupId>
<artifactId>maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven</name>
<description>Spring Boot之maven打包</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.package.directory>target</project.package.directory>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${parent.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${parent.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--spring-boot打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.12.RELEASE</version>
<executions>
<execution>
<goals>
<!-- 重新打包(可以没有主类) -->
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 打包后的路径-->
<outputDirectory>${project.package.directory}/${project.artifactId}/</outputDirectory>
<!-- 打包后的名称 -->
<finalName>maven</finalName>
<!-- 打包类型(JAR、WAR、ZIP、DIR、NONE) -->
<layout>ZIP</layout>
<!-- 主类 -->
<mainClass>com.alian.maven.MavenApplication</mainClass>
<!-- 跳过执行-->
<!-- <skip>true</skip>-->
<!-- 包含或者排除-->
<!--<includes>
<include>
<groupId></groupId>
<artifactId></artifactId>
</include>
</includes>
<excludes>
<exclude>
<groupId></groupId>
<artifactId></artifactId>
</exclude>
</excludes>-->
</configuration>
</plugin>
<!--apache编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<!-- 源代码使用的JDK版本 -->
<source>1.8</source>
<!-- 需要生成的目标class文件的编译版本 -->
<target>1.8</target>
<!-- 编译的字符集编码 -->
<encoding>UTF-8</encoding>
<!-- 跳过测试(此项根据自己需要配置) -->
<skip>true</skip>
<!-- 显示正在编译的信息(此项根据自己需要配置) -->
<verbose>true</verbose>
<!-- 显示正在编译警告(此项根据自己需要配置) -->
<showWarnings>true</showWarnings>
<!-- 允许在单独的进程中运行编译器,后面的参数有用的前提都是此处指定为true,否则用内置的编译器 -->
<!-- <fork>false</fork>-->
<!-- 编译器使用的初始内存(一般不用) -->
<!-- <meminitial>128m</meminitial>-->
<!-- 编译器使用的最大内存(一般不用) -->
<!-- <maxmem>512m</maxmem>-->
</configuration>
</plugin>
<!--apache打jar的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<!-- 为true时生成的jar中,包含pom.xml和pom.properties这两个文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<!-- 生成MANIFEST.MF的设置,用的是spring boot打包可以不配置manifest -->
<manifest>
<!-- 解决maven仓库里带时间戳的包的问题,有spring boot打包插件可以不配置 -->
<!-- <useUniqueVersions>false</useUniqueVersions>-->
<!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
<!-- <addClasspath>true</addClasspath>-->
<!-- 这个jar所依赖的jar包添加classPath的时候的前缀,如果这个jar本身和依赖包在同一级目录,可以不配置 -->
<!-- <classpathPrefix>lib/</classpathPrefix>-->
<!-- 主类,有spring boot打包插件可以不配置 -->
<!-- <mainClass>com.alian.maven.MavenApplication</mainClass>-->
</manifest>
<manifestEntries>
<!-- 在Class-Path下添加配置文件的路径,一般是引入外部配置文件,或者是没有把配置文件打到jar包里,
配置的路径是相对你所要运行的jar所在的目录如:比如我的jar同级目录有个config放了资源文件my.xml
你配置的是"./",则你配置的路径为classpath:config/my.xml
配置的是"./config",则你配置的路径为classpath:my.xml
可以配置多个,用空格隔开就行-->
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<!--排除配置的资源文件,具体的你可以根据自己的项目修改,“**/”表示任意目录下的某个(某些)文件-->
<excludes>
<exclude>**/application.properties</exclude>
<exclude>**/logback.xml</exclude>
<exclude>config</exclude>
<exclude>config/my.xml</exclude>
</excludes>
</configuration>
</plugin>
<!--apache打包资源的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<!--拷贝资源文件-->
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!--输出文件到指定目录,比如我这里是config目录-->
<outputDirectory>${project.package.directory}/${project.artifactId}/config/
</outputDirectory>
<resources>
<!--可有包含多个resource,里面可以指定需要拷贝的资源目录,然后可以进行包含或者排除操作,最终放到上面指定的目录-->
<resource>
<!--需要拷贝资源文件的目录-->
<directory>src/main/resources/</directory>
<!--包含文件,也可以使用排除excludes-->
<includes>
<include>**/application.properties</include>
<include>**/logback.xml</include>
</includes>
</resource>
<resource>
<!--需要拷贝资源文件的目录-->
<directory>src/main/resources/config/</directory>
<!--包含文件,也可以使用排除excludes-->
<includes>
<include>my.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
三、效果图
3.1 所有的资源打包到指定的目录maven
3.2 所有的配置文件都放到config目录
3.3 所有的配置文件都不在jar里,防止敏感信息泄露
结语
平时工作中正常项目打包基本是够用的,只不过对打包的内容部分进行一点点变更。掌握了这几个插件的配置,一般都能解决自己的打包问题。个人觉得没必要把lib包单独拎出去,分出去有lib的变动时,比如依赖版本的更新之类的,还是得删除,拷贝(哪怕时自动化脚本也是这个操作),同时还增加了classpath的问题,个人建议,没有特殊要求还是放到一起吧。