maven打包插件——maven-jar-plugin
·
文章目录
说明
本文是对 maven-jar-plugin 常用配置的介绍,更详细的学习请参照官网文档地址:Apache Maven JAR Plugin
maven-assembly-plugin: maven 生命周期 package 阶段的默认打包插件,用于将 Maven 项目打包成jar(注意该插件不会将项目中引入的依赖打进最终的 Jar 文件)
1.配置pom.xml
1.1 引用指定版本插件
<build>
<plugins>
<!-- 主动声明插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
</plugin>
</plugins>
</build>
1.2 生成可执行jar
java -jar 命令运行 Jar 文件时,必须在 Jar 文件内的 META-INF\MANIFEST.MF 中指定入口类
1.2.1 无依赖项 maven-jar-plugin 配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<!--主类入口-->
<mainClass>com.example.abctest.TestController</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
生成 Jar 文件 META-INF\MANIFEST.MF 的内容为:
Manifest-Version: 1.0
Implementation-Title: abc-test
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven JAR Plugin 3.3.0
Main-Class: com.example.abctest.TestController
1.2.2 有依赖项 maven-jar-plugin 配置
文章最开始已经说过,通过 maven-jar-plugin 生成 Jar 文件时,不会将依赖包函进去;因此需要配置依赖项所在位置
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<!--主类入口-->
<mainClass>com.example.abctest.TestController</mainClass>
<!--将项目的依赖信息添加到 MANIFEST.MF 中的Class-Path-->
<addClasspath>true</addClasspath>
<!--将依赖的存放位置添加到 MANIFEST.MF 中-->
<classpathPrefix>lib/</classpathPrefix>
<!--是否使用唯一的时间戳快照版本而不是-SNAPSHOT版本。默认值为true-->
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
示例:

上述配置生成的 MANIFEST.MF 中多了依赖的信息:
Manifest-Version: 1.0
Implementation-Title: abc-test
Implementation-Version: 0.0.1-SNAPSHOT
Class-Path: lib/fastjson-1.2.83.jar
Build-Jdk-Spec: 1.8
Created-By: Maven JAR Plugin 3.3.0
Main-Class: com.example.abctest.TestController
1.2.3 配合maven-dependency-plugin自动下载依赖jar
maven-dependency-plugin官网文档地址: Apache Maven Dependency Plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<!--主类入口-->
<mainClass>com.example.abctest.TestController</mainClass>
<!--将项目的依赖信息添加到 MANIFEST.MF 中的Class-Path-->
<addClasspath>true</addClasspath>
<!--将依赖的存放位置添加到 MANIFEST.MF 中-->
<classpathPrefix>lib/</classpathPrefix>
<!--是否使用唯一的时间戳快照版本而不是-SNAPSHOT版本。默认值为true-->
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.0</version>
<!--执行配置-->
<executions>
<execution>
<!--名字任意;多个自定义execution时,需要不用名称 -->
<id>copy-dependencies-runtime</id>
<phase>package</phase>
<goals>
<!--执行目标;对依赖进行的操作,具体可以看官方文档-->
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--目标输出位置-->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!--添加依赖范围 https://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html-->
<includeScope>runtime</includeScope>
<!--依赖传递-->
<excludeTransitive>false</excludeTransitive>
</configuration>
</execution>
<execution>
<id>copy-dependencies-system</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>system</includeScope>
<excludeTransitive>true</excludeTransitive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
上述配置会将依赖自动下载到指定目录
示例:

1.3 MANIFEST.MF扩展信息
添加一些定制化的信息可以使用manifestEntries
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>8</source>
<target>8</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<!--主类入口-->
<mainClass>com.example.abctest.TestController</mainClass>
<!--将项目的依赖信息添加到 MANIFEST.MF 中的Class-Path-->
<addClasspath>true</addClasspath>
<!--将依赖的存放位置添加到 MANIFEST.MF 中-->
<classpathPrefix>lib/</classpathPrefix>
<!--是否使用唯一的时间戳快照版本而不是-SNAPSHOT版本。默认值为true-->
<useUniqueVersions>false</useUniqueVersions>
</manifest>
<!--非必选; MANIFEST.MF 额外扩展信息-->
<manifestEntries>
<!--自定义依赖位置-->
<Class-Path>../lib/scan-sdk-1.2.8.jar</Class-Path>
<Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
<Implementation-Vendor-Id>${project.groupId}</Implementation-Vendor-Id>
<Implementation-Title>${project.name}</Implementation-Title>
<Implementation-Version>${project.version}</Implementation-Version>
<Implementation-Copyright>@${project.organization.name}</Implementation-Copyright>
<Organization-Url>${project.organization.url}</Organization-Url>
<Organization-Name>${project.organization.name}</Organization-Name>
<Creation-Date>${maven.build.timestamp}</Creation-Date>
<Built-By>${env.USERNAME}</Built-By>
<Build-Jdk>${java.version}</Build-Jdk>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>copy-dependencies-runtime</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>runtime</includeScope>
</configuration>
</execution>
<execution>
<id>copy-dependencies-system</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>system</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
更多推荐
所有评论(0)