maven几种打包插件介绍,及个人心得总结_maven几种打包插件

文章目录

  • ​​一、maven几种打包插件介绍​​
  • ​​二、插件用法详细介绍​​
  • ​​1.spring-boot-maven-plugin​​
  • ​​介绍​​
  • ​​使用​​
  • ​​2.maven-shade-plugin​​
  • ​​介绍​​
  • ​​使用​​
  • ​​3.maven-assembly-plugin​​
  • ​​介绍​​
  • ​​使用​​
  • ​​4.maven-jar-plugin​​
  • ​​介绍​​
  • ​​使用​​
  • ​​5.maven-dependency-plugin​​
  • ​​介绍​​
  • ​​使用​​
  • ​​6.maven-resources-plugin​​
  • ​​介绍​​
  • ​​使用​​
  • ​​7.maven-compiler-plugin​​
  • ​​介绍​​
  • ​​使用​​
  • ​​三、案例​​
  • ​​准备工作,项目完整路径​​
  • ​​案例3.1:maven-jar-plugin和maven-dependency-plugin -> 打无依赖jar包​​
  • ​​注意点说明:​​
  • ​​案例3.2:maven-assembly-plugin ->打有依赖jar包​​
  • ​​案例3.3:maven-shade-plugin ->打有依赖jar包​​
  • ​​案例3.4:使用spring-boot-maven-plugin插件 -> 打有依赖包​​
  • ​​注意点说明:​​
  • ​​案例3.5:使用maven-resources-plugin和spring-boot-maven-plugin -> 打包​​
  • ​​注意点说明​​
  • ​​四、如何选择几种打包插件​​

一、maven几种打包插件介绍

共5种:

  1. spring-boot-maven-plugin
  2. maven-shade-plugin
  3. maven-assembly-plugin
  4. maven-jar-plugin
  5. maven-dependency-plugin
  6. maven-resources-plugin
  7. maven-compiler-plugin

二、插件用法详细介绍

1.spring-boot-maven-plugin

介绍

spring-boot-maven-plugin:springboot项目默认的打包工具,默认情况下只会将项目​​源码​​编译生成的class文件和资源文件依赖jar包都打进来,​​即打包自己项目的class文件+环境变量+静态资源文件+依赖jar(不会把依赖jar反编译为class文件打入)​​​。
​​​使用2.2.1.RELEASE版本需要maven版本在2.0及以上,JDK在1.8及以上。​

官网文档:​​Spring Boot Maven Plugin​

maven几种打包插件介绍,及个人心得总结_maven几种打包插件_02

使用

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

2.maven-shade-plugin

介绍

​它很聪明地将依赖的JAR文件全部解压后,再将得到的.class文件连同当前项目的.class文件一起合并到最终的CLI包(可以直接运行的jar包)中​​,这样,在执行CLI JAR文件的时候,所有需要的类就都在Classpath中了。

插件:使用​​maven-shade-plugin​​插件

​maven-shade-plugin提供了两大基本功能:​

​将依赖的jar包打包到当前jar包(常规打包是不会将所依赖jar包打进来的);​​​​对依赖的jar包进行重命名(用于类的隔离);​

maven几种打包插件介绍,及个人心得总结_spring boot_03

使用

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>

3.maven-assembly-plugin

介绍

功能非常强大,是maven中针对打包任务而提供的标准插件。​​它是Maven最强大的打包插件,它支持各种打包文件格式,包括zip、tar.gz、tar.bz2等等​​,通过一个打包描述文件设置(src/main/assembly.xml),它能够帮助用户选择具体打包哪些资源文件集合、依赖、模块,甚至本地仓库文件,每个项的具体打包路径用户也能自由控制。

​它不是把依赖的jar直接打进去,而是把依赖的jar编译成class文件打入jar中目录​

maven几种打包插件介绍,及个人心得总结_maven打包插件_04

使用

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.demo.DemoApplication</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<!--下面是为了使用 mvn package命令,如果不加则使用mvn assembly-->
<executions>
<execution>
<id>make-assemble</id>
<!-- 绑定到package生命周期 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

4.maven-jar-plugin

介绍

插件:使用​​maven-jar-plugi​​插件

默认的打包方式,用来打普通的​​project JAR​​包

使用

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<!--要使用的打包配置.-->
<archive>
<!-- 创建的归档文件是否包含以下pom.xml 和pom.properties Maven 文件,默认是true -->
<addMavenDescriptor>true</addMavenDescriptor>
<!-- 生成MANIFEST.MF的设置 -->
<manifest>
<!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
<addClasspath>true</addClasspath>
<!-- 这个jar所依赖的jar包添加classPath的时候的前缀,如果这个jar本身和依赖包在同一级目录,则不需要添加 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar启动入口类 -->
<mainClass>com.example.demo.DemoApplication</mainClass>
</manifest>
<manifestEntries>
<!-- 在Class-Path下添加配置文件的路径 -->
<!--<Class-Path>../config/</Class-Path>-->
</manifestEntries>
</archive>
<!-- jar包的位置,其中${project.build.directory}默认为 target/ -->
<outputDirectory>${project.build.directory}</outputDirectory>
<!--过滤掉不希望包含在jar中的文件-->
<excludes>
<exclude>${project.basedir}/xml/*</exclude>
</excludes>
<!--要包含的文件列表-->
<includes>
<!-- 打jar包时,打包class文件和config目录下面的 properties文件 -->
<!-- 有时候可能需要一些其他文件,这边可以配置,包括剔除的文件等等 -->
<include>**/*.class</include>
<include>**/*.properties</include>
</includes>
</configuration>
</plugin>

5.maven-dependency-plugin

介绍

​maven-dependency-plugin是处理与依赖相关的插件。它有很多可用的goal,大部分是和依赖构建、分析和解决相关的goal,这部分goal可以直接用maven的命令操作​​​,
例如:mvn dependency:tree、mvn dependency:analyze
但是我们最常用到的是dependency:copydependency:copy-dependencies、dependency:unpack、dependency:unpack-dependencies这四个。

maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list能够列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树,dependency:analyze可以告诉你项目依赖潜在的问题,如果你有直接使用到的却未声明的依赖,该目标就会发出警告。

maven-dependency-plugin还有很多目标帮助你操作依赖文件,例如dependency:copy-dependencies能将项目依赖从本地Maven仓库复制到某个特定的文件夹下面。

​详情请看下方别人的文章使用说明:​​​1)Maven学习笔记(十三)-maven-dependency-plugin插件
2)maven-dependency-plugin插件
3)Maven依赖插件之maven-dependency-plugin

官网地址:​​Apache Maven Dependency Plugin​

使用

<!--在打包阶段将依赖的jar包导出到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>
<type>jar</type>
<includeTypes>jar</includeTypes>
<!--项目构件输出目录,其中${project.build.directory}默认为 target/-->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>

6.maven-resources-plugin

介绍

为了使项目结构更为清晰,Maven区别对待Java代码文件和资源文件,​​maven-compiler-plugin​​​用来编译Java代码,​​maven-resources-plugin​​则用来处理资源文件。

​默认的主资源文件目录是src/main/resources​​,很多用户会需要添加额外的资源文件目录,这个时候就可以通过配置maven-resources-plugin来实现。

此外,资源文件过滤也是Maven的一大特性,你可以在资源文件中使用_${propertyName}_形式的Maven属性,然后配置maven-resources-plugin开启对资源文件的过滤,之后就可以针对不同环境通过命令行或者Profile传入属性的值,以实现更为灵活的构建。

​官方文档​​​:​​Apache Maven Resources Plugin​

​详情请看下方别人的文章使用说明:​​​1)maven,maven-resources-plugin根据不同环境覆盖配置文件
2)springboot中maven文件pom.xml的<resource>下的<includes>和<excludes>
3)Maven学习(四) - 插件maven-resources-plugin

使用

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-resources</id>
<!--绑定到package生命周期-->
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>target/conf</outputDirectory>
<useDefaultDelimiters>false</useDefaultDelimiters>
<includeEmptyDirs>true</includeEmptyDirs>
<!--设置自定义分隔符-->
<delimiters>
<delimiter>#</delimiter>
</delimiters>
<resources>
<resource>
<!--从此目录下读取全部以.properties和.xml开头的文件-->
<directory>src/main/resources/</directory>
<!--用来指定需要打入哪些后缀类型的文件-->
<!--<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>-->
</resource>
</resources>
<!-- 过滤后缀为crt和jks的文件 -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>crt</nonFilteredFileExtension>
<nonFilteredFileExtension>jks</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</execution>
</executions>
</plugin>

7.maven-compiler-plugin

介绍

​作用: 1. 指示maven用什么版本的jdk编译; 2. 指示IntelliJ IDEA把项目识别成什么jdk​

maven 是个管理工具,如果我们不告诉它我们的代码要使用什么样的 jdk 版本编译的话,它就会用 maven-compiler-plugin 默认的 jdk 版本来进行处理,这样就容易出现版本不匹配,以至于可能导致编译不通过的问题。

​maven-compiler-plugin插件是一个Maven插件,用来编译项目代码​​;自从3.0开始默认的编译器是javax.tools.JavaCompiler,用来编译Java源码;如果你想强制插件使用javac编译器,你必须配置插件的属性forceJavacCompilerUse;还要注意,当前默认源(source)设置为1.6,默认目标(target)设置为1.6。独立运行Maven和JDK,可以通过source和target选项更改他们的默认值;

​详情请看下方别人的文章使用说明:​​​1)maven-compiler-plugin插件参数配置详解
2)Maven 教程(21)— maven-compiler-plugin 插件详解
3)maven-compiler-plugin 插件详解

使用

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>

三、案例

准备工作,项目完整路径

maven几种打包插件介绍,及个人心得总结_maven_05

案例3.1:maven-jar-plugin和maven-dependency-plugin -> 打无依赖jar包

pom依赖

<plugins>
<!--要求:1、导出单独的项目jar包(精简,不包含依赖jar)、2、项目依赖的所有jar包导出到lib目录下-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<!--要使用的打包配置.-->
<archive>
<!-- 创建的归档文件是否包含以下pom.xml 和pom.properties Maven 文件,默认是true -->
<addMavenDescriptor>true</addMavenDescriptor>
<!-- 生成MANIFEST.MF的设置 -->
<manifest>
<!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
<addClasspath>true</addClasspath>
<!-- 这个jar所依赖的jar包添加classPath的时候的前缀,如果这个jar本身和依赖包在同一级目录,则不需要添加 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar启动入口类 -->
<mainClass>com.example.demo.DemoApplication</mainClass>
</manifest>
<manifestEntries>
<!-- 在Class-Path下添加配置文件的路径 -->
<!--<Class-Path>../config/</Class-Path>-->
</manifestEntries>
</archive>
<!-- jar包的位置,其中${project.build.directory}默认为 target/ -->
<outputDirectory>${project.build.directory}</outputDirectory>
<!--过滤掉不希望包含在jar中的文件-->
<excludes>
<exclude>${project.basedir}/xml/*</exclude>
</excludes>
<!--要包含的文件列表-->
<includes>
<!-- 打jar包时,打包class文件和config目录下面的 properties文件 -->
<!-- 有时候可能需要一些其他文件,这边可以配置,包括剔除的文件等等 -->
<include>**/*.class</include>
<include>**/*.properties</include>
</includes>
</configuration>
</plugin>

<!--在打包阶段将依赖的jar包导出到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>
<type>jar</type>
<includeTypes>jar</includeTypes>
<!--项目构件输出目录,其中${project.build.directory}默认为 target/-->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>

打包目录结果展示

maven几种打包插件介绍,及个人心得总结_maven_06

maven几种打包插件介绍,及个人心得总结_打包插件_07

注意点说明:

​注意点1:​

maven官网针对maven-jar-plugin的标签有详细的说明,这里只使用部分的标签,案例用到的请看代码中文介绍,所有标签使用详情请看下方官网链接 ↓。
​​​官网地址​​​:​​maven 仓库的插件介绍地址​

maven几种打包插件介绍,及个人心得总结_打包插件_08


​注意点2:​

​代码中提到的${project.build.directory}使用说明,请看下方链接 ↓​

​​Maven: Maven的六类属性,maven几种打包插件介绍,及个人心得总结_spring boot_09{project.build.directory}​​

maven几种打包插件介绍,及个人心得总结_spring boot_10

​注意点3:​​ 针对标签<addMavenDescriptor>设置【true/false】不同结果展示

设置true

maven几种打包插件介绍,及个人心得总结_maven几种打包插件_11

设置false

maven几种打包插件介绍,及个人心得总结_maven几种打包插件_12


​注意点4:​​ 使用<manifest>标签就是为了生成MANIFEST.MF的设置

<!-- 生成MANIFEST.MF的设置 -->
<manifest>
<!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
<addClasspath>true</addClasspath>
<!-- 这个jar所依赖的jar包添加classPath的时候的前缀,如果这个jar本身和依赖包在同一级目录,则不需要添加 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar启动入口类 -->
<mainClass>com.example.demo.DemoApplication</mainClass>
</manifest>

maven几种打包插件介绍,及个人心得总结_maven_13


​注意点5:​​​​说明:i18n文件夹是国际化词条文件,全是.properties格式文件,static文件夹下是静态资源,包括css,js,image等等,template文件夹是.html格式页面,config文件下是一个自定义配置文件cat.yml​

使用<includes>标签设置要包含的文件列表,比如我只配置打入.class和.properties文件,那么resources下的config文件、static文件夹、template文件夹内容都不会打入jar包中。

<!--要包含的文件列表-->
<includes>
<!-- 打jar包时,打包class文件和config目录下面的 properties文件 -->
<!-- 有时候可能需要一些其他文件,这边可以配置,包括剔除的文件等等 -->
<include>**/*.class</include>
<include>**/*.properties</include>
</includes>

设置<includes>标签

maven几种打包插件介绍,及个人心得总结_打包插件_07

不设置<includes>标签

maven几种打包插件介绍,及个人心得总结_maven打包插件_15


​注意点6:​

<manifestEntries>
<!-- 在Class-Path下添加配置文件的路径 -->
<!--<Class-Path>../config/</Class-Path>-->
</manifestEntries>

这个<Class-Path>标签暂时没找到相关文章说明它的用法,我自己是没弄明白,有懂的可以评论交流学习下

案例3.2:maven-assembly-plugin ->打有依赖jar包

pom依赖

<!--需求2:使用maven-assembly-plugin打有依赖的jar包-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.demo.DemoApplication</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<!--下面是为了使用 mvn package命令,如果不加则使用mvn assembly-->
<executions>
<execution>
<id>make-assemble</id>
<!-- 绑定到package生命周期 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

打包目录结果打印

maven几种打包插件介绍,及个人心得总结_maven几种打包插件_16


maven几种打包插件介绍,及个人心得总结_maven打包插件_04

案例3.3:maven-shade-plugin ->打有依赖jar包

pom依赖

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>

打包目录结果打印

maven几种打包插件介绍,及个人心得总结_打包插件_18


maven几种打包插件介绍,及个人心得总结_spring boot_03

案例3.4:使用spring-boot-maven-plugin插件 -> 打有依赖包

pom依赖

<!--需求4:使用spring-boot-maven-plugin插件打包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

打包结果打印

maven几种打包插件介绍,及个人心得总结_spring boot_20

maven几种打包插件介绍,及个人心得总结_maven几种打包插件_02

注意点说明:

​注意点1:​​​​spring-boot-maven-plugin​​插件它会把完整的jar直接打到如BOOT-INF目录下的lib目录下,而不是像​​maven-assembly-plugin​​插件和​​maven-shade-plugin​​插件把jar编译成class文件,而代码class文件全部放在了BOOT-INF目录下的classes文件夹下。

案例3.5:使用maven-resources-plugin和spring-boot-maven-plugin -> 打包

pom依赖

<!--需求5:使用spring-boot-maven-plugin和插件打包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-resources</id>
<!--绑定到package生命周期-->
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>target/conf</outputDirectory>
<useDefaultDelimiters>false</useDefaultDelimiters>
<includeEmptyDirs>true</includeEmptyDirs>
<!--设置自定义分隔符-->
<delimiters>
<delimiter>#</delimiter>
</delimiters>
<resources>
<resource>
<!--从此目录下读取全部以.properties和.xml开头的文件-->
<directory>src/main/resources/</directory>
<!--用来指定需要打入哪些后缀类型的文件-->
<!--<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>-->
</resource>
</resources>
<!-- 过滤后缀为crt和jks的文件 -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>crt</nonFilteredFileExtension>
<nonFilteredFileExtension>jks</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</execution>
</executions>
</plugin>

打包目录结果打印

maven几种打包插件介绍,及个人心得总结_maven几种打包插件_22


maven几种打包插件介绍,及个人心得总结_打包插件_23

注意点说明

​注意点1:.jar.original包指代上一次打包的备份文件​

四、如何选择几种打包插件

maven几种打包插件介绍,及个人心得总结_maven几种打包插件_24