文章目录
- 一、简介
- 二、pom.xml
- 三、效果图
- 3.1 所有的资源打包到指定的目录maven
- 3.2 所有的配置文件都放到config目录
- 3.3 所有的配置文件都不在jar里,防止敏感信息泄露
- 结语
一、简介
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的问题,个人建议,没有特殊要求还是放到一起吧。