maven将lib打包进jar_maven lib-程序员宅基地

技术标签: Java & Spring  

更多打包方式参见:
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>

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luo15242208310/article/details/114699132

智能推荐

软件设计师——算法设计与C语言实现(下午试题四)_软件设计师 代码题-程序员宅基地

文章浏览阅读784次。时间复杂度是指程序运行从开始到结束所需要的时间。通常分析时间复杂度的方法是从算法中选取一种对于所研究的问题来说是基本运算的操作以该操作重复执行的次数作为算法的时间度量。一般来说,算法中原操作重复执行的次数是规模n的某个函数T(n)。由于许多情况下要精确计算T(n)是困难的,因此引入了渐进时间复杂度在数量上估计一个算法的执行时间。空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小。_软件设计师 代码题

Excel自定义函数UDF引起的问题-程序员宅基地

文章浏览阅读1.1k次。udf 函数自定义函数 Excel自定义函数UDF引起的问题 (Excel Custom Function UDF Causing Problems) Excel macros ran really slowly in a workbook that someone sent to me. They said it was an Excel custom function (UDF) causin..._excel安装formulaudf.udf

angularjs---------路由-程序员宅基地

文章浏览阅读210次。什么是路由?angularjs路由是指一款用angularjs前端语言设计出程序和框架的路由器;我们可以使用angularjs路由简单优雅地实现页面之间的控制跳转;下面简单写一下路由的实例:html lang="en" ng-app="myApp">head> meta charset="UTF-8"> title>Titletitle> scrip

google浏览器高版本 跨域第三方cookie(qlik)无法携带问题解决_高版本浏览器不允许跨服务器cookie-程序员宅基地

文章浏览阅读1.7k次。报表门户网站多租户改造时,某个租户访问网站的域名属于外网(假设为:a.niu.com) 和集成的qlik报表服务域名不同(假设为:qlik.diao.com),这时候diao.com的cookie无法从当前站点a.niu.com携带到qlik.diao.com,这个问题目前常用的解决方案就是:第三方服务器设置cookie的属性:SameSite=None; Secure 即可。下面是samesite属性的简单介绍:SameSite 有3个值1. StrictStrict最为严格,完全禁止第三方 Co_高版本浏览器不允许跨服务器cookie

Qt pushbutton按钮常用方法及技巧总结_pushbutton按钮触发范围改变-程序员宅基地

文章浏览阅读6.3k次,点赞5次,收藏35次。1.按钮常用的信号2.按钮的自动重复使用3.按钮的自定义图形设置3.1 资源文件的添加3.2 更改样式表4.按钮不同状态的切换,使用标志位5.按钮简单布局整理1.按钮常用的信号按钮常用的信号有clicked、pressed和released。clicked点击,pressed按下,release释放,一般来说后两者经常放在一块使用,按下一种状态,释放按钮又是另一种状态,对于普通的点击clicked基本能满足要求。// Signalsvoid clicked(bool checke_pushbutton按钮触发范围改变

【python知识点补充】python文件引入同级py文件类的方法_python可以import同级别的py吗-程序员宅基地

文章浏览阅读1.6k次。https://blog.csdn.net/weixin_41699811/article/details/84965328_python可以import同级别的py吗

随便推点

通过Socket uevent与内核通信_uevent socket-程序员宅基地

文章浏览阅读836次。最近有编写一个简单的功能,就是通过底层中断来模拟一个按键返回事件通过uevent的机制来与内核驱动进行通信,当然要模拟一个按键返回事件也可以简单在底层直接上报按键事件,这里我只是简单讲解下uevent的通信机制,其实就是通过socket通信拉,只是一些参数设置不太一样。大家以前做过局域网通信的朋友都知道socket通信机制的一些基本原理,所以这里就不详细扯socket通信的基础理论_uevent socket

乐高创意机器人moc_乐高玩具系列用乐高积木组装机器人模型的方法,简单又好玩...-程序员宅基地

文章浏览阅读992次。随着乐高在国内普及度越来越高,不光是儿童,许多成年人也加入玩乐高的行列中,在 MOC 中设计者完全不用考虑这些条条框框的约束,可以天马行空地构建出任何复杂的结构益智乐高,可以提高孩子们的动手能力,不得不承认,MOC玩法,让很多人有机会实现心中的梦想,今天为大家分享如何用乐高积木拼装机器人模型的方法,难度2颗星,简单又好玩,大家不妨来试试哦,精彩不容错过!还有更多有创意的内容等待你去发掘!..._乐高积木随意拼装成对生活有用的东西

详解ABAP Selection Screens_at selection-screen on-程序员宅基地

文章浏览阅读2.7k次。转载自大神jevinxu:详解ABAP Selection Screens:http://www.sapjx.com/abap-selection-screen.html ABAP Selection Screens用户与SAP数据之间的通信交互是通过对屏幕的操作来实现的,如:数据报表,业务功能操作等,而SAP的屏幕开发一般分_at selection-screen on

Android 插件化开发——对startActivity方法进行hook(一)_hook startactivity-程序员宅基地

文章浏览阅读649次。本篇博客主要讲述一下对startActivity进行hook,对于Android开发来说,跳转一个新的Activity页面,最常见的无非两种了,方法一:Intent intent = new Intent(MainActivity.this, NewActivity.class);startActivity(intent);方法二:Intent intent = new Intent(..._hook startactivity

在服务器上如何打开mdf文件,在没sql server数据库状况下怎么打开.mdf文件-程序员宅基地

文章浏览阅读554次。1.新建一个同名的数据库(数据文件与原来的要一致)2.再停掉sql server(注意不要分离数据库)3.用原数据库的数据文件覆盖掉这个新建的数据库4.再重启sql server5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用数据库的脚本创建一个新的数据库,并将数据导进去就行..._没安装sqlserver navicat premium 16 怎么打开.mdf文件

java程序员学技术都会访问那些网站?_chungwe java-程序员宅基地

文章浏览阅读101次。java程序员学技术的网站哔哩哔哩https://www.bilibili.com/ CSDNhttps://www.csdn.net/nav/java 掘金https://juejin.cn/ 简书https://www.jianshu.com/ 博客园https://www.cnblogs.com/ 慕课网https://www.imooc.com/ GooGleVip8http://googlevip8.com githubhttp://github.com/ 码云..._chungwe java

推荐文章

热门文章

相关标签