maven将lib打包进jar
一、singlemaven build插件设置<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><des
·
方式
更多打包方式参见:
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包内,
- 项目源代码、依赖的第三方lib都会以*.class的形式被打包Jar包内;
- 且资源文件(*.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>
更多推荐
所有评论(0)