700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > maven将lib打包进jar

maven将lib打包进jar

时间:2021-04-03 10:23:38

相关推荐

maven将lib打包进jar

方式

一、maven-assembly-plugin - single二、onejar-maven-plugin三、copy dependencies to directory /lib四、spring-boot-maven-plugin

更多打包方式参见:

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.ty.tyClientSampler</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└─onejarBoot.javaHandler.javaIProperties.javaJarClassLoader.javaOneJarFile.javaOneJarURLConnection.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.0Archiver-Version: Plexus ArchiverBuilt-By: luohqClass-Path: lib/commons-lang-2.6.jar lib/commons-lang3-3.8.1.jar lib/commons-codec-1.12.jar lib/netty-all-4.1.24.Final.jar lib/poi-3.13-beta1.jar lib/protobuf-java-2.6.1.jarCreated-By: Apache Maven 3.5.4Build-Jdk: 1.8.0_192Main-Class: com.mx.server.tsp2.upload.vehicle.upload.mock.MxVehicleUploadMockMain

即需要【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>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。