说明

本文是对 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>
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐