常用maven打包插件

编程

1. maven-jar-plugin 插件

使用场景:通常我们在开发的时候会有很多个模块,模块与模块之间的依赖便是通过jar包来导入,形成传递依赖。正常情况下,一个工程打包后就可以提供给其他工程使用。但是如果这个jar自己需要使用,同时又要提供其中一部分能力给别人使用,那么我们就需要将此工程打包成两个文件,而提供给第三方使用的jar包需要打入特定的java文件。

在pom文件中,加入如下配置:

<build>

<resources>

<resource>

<!-- 将此目录下的资源文件也打入jar包中 -->

<directory>src/main/resources</directory>

<filtering>true</filtering>

</resource>

</resources>

<plugins>

<plugin>

<artifactId>maven-jar-plugin</artifactId>

<executions>

<execution>

<id>app-sdk</id>

<!-- 将jar目标绑定到package阶段中,那么在package阶段运行时将执行此goal -->

<goals><goal>jar</goal></goals>

<phase>package</phase>

<configuration>

<!-- 将此目录下的文件编译打包,classifier用于区分jar包的多个版本 -->

<classesDirectory>src/main/java</classesDirectory>

<classifier>sdk</classifier>

<includes>

<!-- 指定哪些文件打入jar包,即定制化打包 -->

<include>**/FingerprintTookit.java</include>

<include>**/SignatureEntity.java</include>

<include>**/SignatureConst.java</include>

</includes>

</configuration>

</execution>

</executions>

</plugin>

</plugins>

</build>

各个标签的作用在注释中也都简单解释了,当我们执行mvn clean package的时候,在控制台可以看到如下信息。此工程执行了两次打包,第一次的id为 default-jar的一个目标,第二次执行的是id 为app-sdk 的打包。并且其最后的文件格式为:artifactId-version-classifier的格式,当引用此jar的时候也需要加上标签:<classifier>sdk</classifier>

最后的打包结果:

因此,我们可以知道,即使在工程的pom.xml文件下不加入 maven-jar-plugin 插件,mvn package 也会执行默认的打包。请注意,如果我们打包的时候指定了运行的main函数,也就是说此jar包是可运行的文件,在其他模块引用的时候,将无法导包。

2. 插件:spring-boot-maven-plugin

先贴个官方文档:https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/html/

spring-boot-maven-plugin 插件以Maven的方式为Springboot应用提供支持,能够将Springboot应用打包为可执行的jar或war文件,进行相应部署后即可启动Springboot应用。

    (1)对于使用了 spring-boot-starter-parent 的项目, 只需在properties中指定start-class启动类即可

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.0.3.RELEASE</version>

<relativePath />

</parent>

<properties>

<start-class>com.bootdo.MyApplication</start-class>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<java.version>1.8</java.version>

</properties>

并且以下目标都可以使用,而不需要其他配置:spring-boot:repackage,spring-boot:run,spring-boot:start,spring-boot:stop  

(2) 如果没有继承spring-boot-starter-parent,则需要手动配置,比如打包,这样就可以使用 mvn spring-boot:repackage 命令了

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<version>2.3.1.RELEASE</version>

<configuration>

<mainClass>${start.class}</mainClass>

<layout>ZIP</layout>

</configuration>

<executions>

<execution>

<goals>

<goal>repackage</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

layout属性可以是jar,war,zip(dir),这样打出来的包包含: BOOT-INF/classes 和 BOOT-INF/lib,也就是说源码和依赖包是分开,这样呢方便在容器化的时候替换或者映射,同时,还可以进一步分层,添加以下配置:

                <configuration>

<layers>

<enabled>true</enabled>

</layers>

</configuration>

这样可以得到包含以下四个目录的jar包:

  • dependencies 不包含SNAPSHOT的依赖包

  • spring-boot-loader jar包启动类

  • snapshot-dependencies 版本包含 SNAPSHOT的依赖

  • application 应用和资源类

以上的分层配置等价下面的配置,也就是可以按照下面的方式进行定制化分层打包

<project>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<version>2.3.1.RELEASE</version>

<configuration>

<layers>

<enabled>true</enabled>

<configuration>${project.basedir}/src/layers.xml</configuration>

</layers>

</configuration>

</plugin>

</plugins>

</build>

</project>

<layers xmlns="http://www.springframework.org/schema/boot/layers"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/boot/layers

https://www.springframework.org/schema/boot/layers/layers-2.3.xsd">

<application>

<into layer="spring-boot-loader">

<include>org/springframework/boot/loader/**</include>

</into>

<into layer="application" />

</application>

<dependencies>

<into layer="snapshot-dependencies">

<include>*:*:*SNAPSHOT</include>

</into>

<into layer="dependencies" />

</dependencies>

<layerOrder>

<layer>dependencies</layer>

<layer>spring-boot-loader</layer>

<layer>snapshot-dependencies</layer>

<layer>application</layer>

</layerOrder>

</layers>

更多超实用的使用案例,可以参考这里:https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/html/#repackage-examples

3. 插件:maven-assembly-plugin

使用场景,当项目开发好了,需要对外提供一整套的运行包,包括配置文件,启动脚本,停止脚本等文件,在使用springboot开发的时候,最后的文件就是一个可运行的jar包,因此需要手动组装一些必要的文件,版本发布的时候每次都人工的拷贝文件,岂不是很麻烦,这个时候就需要此插件了。

典型配置如下:

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-assembly-plugin</artifactId>

<configuration>

<appendAssemblyId>false</appendAssemblyId>

<descriptors>

<descriptor>src/main/assembly/assembly.xml</descriptor>

</descriptors>

</configuration>

<executions>

<execution>

<id>make-pkg</id>

<phase>package</phase>

<goals>

<goal>attached</goal>

</goals>

</execution>

</executions>

</plugin>

最主要的就是desriptor标签,它指定了一个assembly.xml的文件位置。也就是说核心配置在此文件中。

<?xml version="1.0" encoding="UTF-8"?>

<assembly

xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

<id>all</id>

<formats>

<format>tar.gz</format>

</formats>

<includeBaseDirectory>false</includeBaseDirectory>

<files>

<file>

<source>${project.build.directory}/${output.filename}.jar</source>

<outputDirectory></outputDirectory>

<fileMode>0755</fileMode>

</file>

<file>

<source>src/main/resources/application.properties</source>

<outputDirectory>config</outputDirectory>

<fileMode>0755</fileMode>

</file>

</files>

<fileSets>

<fileSet>

<directory>src/main/resources/scripts</directory>

<outputDirectory></outputDirectory>

<filtered>true</filtered>

<fileMode>0755</fileMode>

</fileSet>

</fileSets>

</assembly>

id/formats 

  • formats是assembly插件支持的打包文件格式,有dir、zip、tar、tar.gz、tar.bz2、jar、war。可以同时定义多个format。一般采tar.gz,解压后就会得到标准的目录结构。而dir直接就是以目录的形式展示。
  • id则是添加到打包文件名的标识符,用来做后缀。

fileSets/fileSet

用来设置一组文件在打包时的属性。

  • directory:源目录的路径。
  • includes/excludes:设定包含或排除哪些文件,支持通配符。
  • fileMode:指定该目录下的文件属性,采用Unix八进制描述法,默认值是0644。对于可执行的文件就写0755,在Linux环境就能直接运行。
  • outputDirectory:生成目录的路径。不写就是默认的当前打包下。

files/file

与fileSets大致相同,不过是指定单个文件,并且还可以通过destName属性来设置与源文件不同的名称。

完整的使用方法请参考官方文档:

http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

 

参考博客:

https://www.cnblogs.com/april-chen/p/10414857.html

https://www.jb51.net/article/186732.htm

以上是 常用maven打包插件 的全部内容, 来源链接: utcz.com/z/518472.html

回到顶部