更多打包方式参见:
baeldung - How to Create an Executable JAR with Maven

一、maven-assembly-plugin - single

maven build插件设置

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>com.mx.tsp2.netty.client.jmeter.NettyClientSampler</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

打包后target目录
在这里插入图片描述
Jar解压后结构
在这里插入图片描述

Jar with dependencies解压后结构
在这里插入图片描述
会发现Jar with dependencies Jar包内,

  1. 项目源代码、依赖的第三方lib都会以*.class的形式被打包Jar包内;
  2. 且资源文件(*.properties, *.xsd, *.gif等)也会被打进jar包内;

注:
实际打包过程中发现Jar-with-dependencies超过100M,太大了忍不了😢
由于此处打包供Jmeter使用,所以可以排除Jmeter的相关依赖,即设置scope为provided(如下设置),而Jar中依赖的Log4j2相关依赖在JMeter运行时Jar已经包括了,故也可以排除Log4j2相关依赖,最终排除多余依赖后的Jar控制在8.3M左右,可以接受😄

 <!-- JMeter Java -->
<dependency>
    <groupId>org.apache.jmeter</groupId>
    <artifactId>ApacheJMeter_java</artifactId>
    <version>5.3</version>
    <scope>provided</scope>
</dependency>

二、onejar-maven-plugin

 <!-- Includes the runtime dependencies -->
<plugin>
    <groupId>com.jolira</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <version>1.4.4</version>
    <executions>
        <execution>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.mx.server.tsp2.upload.vehicle.upload.mock.MxVehicleUploadMockMain</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

在这里插入图片描述

D:.
│  .version
│  OneJar.class
│
├─com
│  └─simontuffs
│      └─onejar
│              Boot$1.class
│              Boot$2.class
│              Boot$3.class
│              Boot.class
│              Handler$1.class
│              Handler.class
│              IProperties.class
│              JarClassLoader$1.class
│              JarClassLoader$2.class
│              JarClassLoader$ByteCode.class
│              JarClassLoader$FileURLFactory$1.class
│              JarClassLoader$FileURLFactory.class
│              JarClassLoader$IURLFactory.class
│              JarClassLoader$OneJarURLFactory.class
│              JarClassLoader.class
│              OneJarFile$1.class
│              OneJarFile$2.class
│              OneJarFile.class
│              OneJarURLConnection.class
│
├─doc
│      one-jar-license.txt
│
├─lib
│      commons-codec-1.12.jar
│      commons-lang-2.6.jar
│      commons-lang3-3.8.1.jar
│      netty-all-4.1.24.Final.jar
│      poi-3.13-beta1.jar
│      protobuf-java-2.6.1.jar
│
├─main
│      ev32960_mock-1.2.jar
│
├─META-INF
│      MANIFEST.MF
│
└─src
    │  OneJar.java
    │
    └─com
        └─simontuffs
            └─onejar
                    Boot.java
                    Handler.java
                    IProperties.java
                    JarClassLoader.java
                    OneJarFile.java
                    OneJarURLConnection.java

以上打出的*.one-jar.jar是可以直接运行的,且其中lib下为依赖的jar,main下为当前项目的jar。
注:
在JMeter中lib/ext中放入该Jar包后,JMeter是无法识别其中自定义的类

三、copy dependencies to directory /lib


<!-- copy dependencies to target/lib and Manifest reply lib/** -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <!-- <version>2.4</version>-->
    <!-- 对要打的jar包进行配置 -->
    <configuration>
        <!-- Configuration of the archiver -->
        <archive>
            <!--生成的jar中,不要包含pom.xml和pom.properties这两个文件-->
            <addMavenDescriptor>false</addMavenDescriptor>
            <!-- Manifest specific configuration -->
            <manifest>
                <mainClass>
                    com.mx.server.tsp2.upload.vehicle.upload.mock.MxVehicleUploadMockMain
                </mainClass>
                <!--是否要把第三方jar放到manifest的classpath中-->
                <addClasspath>true</addClasspath>
                <!-- 生成的manifest中classpath的前缀, 因为要把第三方jar放到lib目录下, 所以classpath的前缀是lib/ -->
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
        </archive>
        <!--过滤掉不希望包含在jar中的文件-->
        <excludes>
            <!-- 排除不需要的文件夹(路径是jar包内部的路径) -->
            <exclude>**/assembly/</exclude>
        </excludes>
    </configuration>
</plugin>

在这里插入图片描述
在这里插入图片描述

解压Jar包后发现仅包含自定义的Java类,且其相关依赖皆在lib文件夹下
在这里插入图片描述
且META-INF/MANIFEST.MF内容如下

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: luohq
Class-Path: lib/commons-lang-2.6.jar lib/commons-lang3-3.8.1.jar lib/c
 ommons-codec-1.12.jar lib/netty-all-4.1.24.Final.jar lib/poi-3.13-bet
 a1.jar lib/protobuf-java-2.6.1.jar
Created-By: Apache Maven 3.5.4
Build-Jdk: 1.8.0_192
Main-Class: com.mx.server.tsp2.upload.vehicle.upload.mock.MxVehicleUpl
 oadMockMain

即需要【Jar包+lib文件夹】才可以启动Jar包

四、spring-boot-maven-plugin


<!-- Springboot 48.1M且无法排除provided依赖 -->
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.4.2</version>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>spring-boot</classifier>
                <mainClass>
                    com.mx.server.tsp2.upload.vehicle.upload.mock.MxVehicleUploadMockMain
                </mainClass>
            </configuration>
        </execution>
    </executions>
</plugin>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐