如何打一个FatJar(uber-jar)

FatJar也就叫做UberJar,是一种可执行的Jar包(Executable Jar)。FatJar和普通的jar不同在于它包含了依赖的jar包。

1. maven-jar-plugin

例子

<build><finalName>demo</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.0.0</version><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory><overWriteReleases>false</overWriteReleases><overWriteSnapshots>false</overWriteSnapshots><overWriteIfNewer>true</overWriteIfNewer></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>com.yourcompay.Demo</mainClass></manifest></archive></configuration></plugin></plugins>
</build>
  1. 首先使用maven-dependency-plugin把依赖全部copy到outputDirectory中,为了将包打到一个jar中,需要把outputDirectory配置到classes/lib中
  2. 使用maven-jar-plugin指定MainClass和classpath,需要注意的是classpathPrefix必须是${project.build.finalName}/lib路径
  3. 执行命令
java -jar ./target/demo.jar

注意:采用maven-jar-plugin方式有个缺点,demo.jar不能移动到其他路径下面执行java -jar命令,因为demo.jar依赖放在了lib/目录下

解决方法有点复杂,首先用maven-dependency-plugin把依赖copy到${project.build.directory}/classes/lib,然后需要自定义jar加载的classloader,真复杂...

2. maven-assembly-plugin

maven-assembly-plugin是一个强大的打包工具,除了jar包还能打zip、tar.gz、tar.bz2等类型的包,描述文件放在assembly.xml中

如何用assembly打一个FatJar,使用预定义格式jar-with-dependencies打包

实际上

<build><finalName>demo</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.0.0</version><configuration><archive><manifest><mainClass>com.yourcompany.Demo</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>

执行命令make clean package,得到demo-jar-with-dependencies.jar,这时我们就可以使用java -jar命令了

注意:预定义格式jar-with-dependencies实际上只有基本的FatJar打包功能,背后集成是maven-shade-plugin。下一节就讲shade-plugin

3. maven-shade-plugin

3.1 一个简单的例子

maven-shade-plugin将goal shade:shade绑定到maven的package阶段

<build><finalName>demo</finalName><plugins><plugin><artifactId>maven-shade-plugin</artifactId><version>3.0.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals></execution></executions></plugin></plugins>
</build>

执行命令maven package在target目录下生成一个demo.jar

3.2 设置MainClass创建一个可执行的Jar包

<build><finalName>demo</finalName><plugins><plugin><artifactId>maven-shade-plugin</artifactId><version>3.0.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><manifestEntries><Main-Class>com.yourcompany.Demo</Main-Class></manifestEntries></transformer></transformers></configuration></execution></executions></plugin></plugins>
</build>

执行mvn package命令生成一个demo.jar,执行demo.jar

java -jar ./target/demo.jar

3.2.1 Resource Transformers

  1. AppendingTransformer 增加一个文件到resource
  2. XmlAppendingTransformer 增加一个xml到resource
  3. ManifestResourceTransformer 设置MANIFEST

3.3 使用include/exclude指定需要打包的jar

在configuration元素下增加includes和excludes节点

<configuration><artifactSet><includes><include>org.apache.commons:commons-langs</include></includes><excludes><exclude>com.alibaba:fastjson</exclude></excludes></artifactSet>
</configuration>

3.4 使用filter过滤jar包中的类或者资源

在configuration元素下增加filters节点

<configuration><filters><filter><artifact>junit:junit</artifact><includes><include>junit/framework/**</include><include>org/junit/**</include></includes><excludes><exclude>org/junit/experimental/**</exclude><exclude>org/junit/runners/**</exclude></excludes></filter></filters>
</configuration>

3.5 maven-shade-plugin 自动将所有不使用的类全部排除掉

<executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><minimizeJar>true</minimizeJar></configuration></execution>
</executions>

如何打一个FatJar(uber-jar)相关推荐

  1. 单纯的Java项目打成一个可运行jar包或者普通依赖包

    写一个Java工具打成可运行jar包提供使用,或者普通依赖包. 目录 写一个Java工具打成可运行jar包提供使用,或者普通模块包. 方案一.打出的jar包里结果比较乱 方案二.依赖jar包打到外面, ...

  2. 使用Maven 实现打包生成一个可执行jar包:附详细配置解释说明

    1. 需求 项目打包,满足以下要求: 1.整个项目打一个Zip包下面包括应用程序.应用程序依赖的jar包.说明文档 2.项目打的jar包可以执行不同类里的Main函数 3.项目源码打的jar包要与依赖 ...

  3. Maven Assembly Plugin - 如何将Maven工程打成一个可执行jar包

    参考自: http://blog.csdn.net/symgdwyh/article/details/6081532 Maven Assembly Plugin http://maven.apache ...

  4. java五子棋代码详解_代码详解:Java和Valohai的深度学习之旅

    全文共10735字,预计学习时长22分钟或更长 有一款生命周期管理工具(也称云服务)叫做Valohai,它有着友好的用户界面和简洁的布局设计. 许多有关Valohai的案例和文档都是基于Python和 ...

  5. 跳槽神器!阿里巴巴内部出品“Spring全线笔记”,不止是全家桶,理论与实战结合,挑战年薪80w!

    1. Spring的优点和缺点 a) 方便解耦,简化开发 集中管理对象,对象和对象之间的耦合度减低,方便维护对象. b) AOP编程的支持 在不修改代码的情况下可以对业务代码进行增强,减少重复代码,提 ...

  6. java程序打包为jar_将Java应用程序打包为一个(或胖)JAR

    java程序打包为jar 这篇文章将针对一个有趣但非常强大的概念:将您的应用程序打包为单个可运行的JAR文件,也称为一个或胖 JAR. 我们习惯了大型WAR归档文件,其中包含所有打包在某些常见文件夹结 ...

  7. 将Java应用程序打包为一个(或胖)JAR

    这篇文章的目标是一个有趣但非常强大的概念:将应用程序打包为单个可运行的JAR文件,也称为一个或胖 JAR文件. 我们习惯了大型WAR归档文件,其中包含所有打包在某些公用文件夹结构下的依赖项. 使用类似 ...

  8. 将一个普通 JAR 文件打包为 plugin 的一个问题

    最近一直在使用 commons-httpclient-3.1.jar 模拟 HTTP client 端,但是该 jar 只是一个普通 jar 文件,不是一个 plugin, 而我们的需求是既要能在 E ...

  9. 如何让Jython自动加载一个Jar包

    Jython 的docstring 严重缺失, pydev的calltip基本上没什么用, 所以使用 jython 开发比较痛苦. 但 jython 相比 cpython 仍有2个优势: 1. win ...

最新文章

  1. andriod之对话框--标准对话框、列表对话框、自定义对话框
  2. android x86怎么引导,Android、Ubuntu、win三系统引导求教
  3. Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型
  4. asp.net 添加成功弹出个div提示_Word双栏目录怎么做,这3个步骤早知道,让人眼前一亮...
  5. 用21张图,把Git 工作原理彻底说清楚
  6. JDOM/XPATH编程指南
  7. css flex布局 padding,CSS3 flex布局之快速实现BorderLayout布局
  8. 计算机面试的时候写过的代码,程序员悲催瞬间:来之不易的美团面试,我尽然挂了(还原真实场景)...
  9. 音速索尼克 怪人_如何使用AI玩刺猬索尼克。 真干净!
  10. GitLab 8.9 新增文件锁 和 U2F硬件支持
  11. 十大Ajax框架(排名不分先后)
  12. 小米盒子刷成无线打印服务器,小米盒子刷windows系统教程
  13. linux 内核 addr2line,內核調試 arm-none-linux-gnueabi-addr2line 工具使用
  14. 明尼苏达大学双城分校计算机科学,UMN的Computer Science Engineering「明尼苏达大学双城分校计算机科学与工程系」...
  15. H3CNE 综合实验,全网最全教程
  16. 麦德龙的商品供应链管理
  17. sqldblink建好不能查询_眉山这个停车场显示有车位却不能停?原来是……
  18. python游戏csgo开挂_V社:用深度学习检测CSGO中的开挂行为
  19. Chap1_基础理论+Chap2_数据准备和数据模型
  20. “找不到或加载主类”是什么意思?

热门文章

  1. Android layer-list(3)
  2. UVa 374 - Big Mod
  3. iOS下的类似Android的toast提示
  4. 授权管理【学习笔记】《卓有成效的管理者》 第二章 掌握自己的时间
  5. ITSM实施三招[案例]
  6. 校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)
  7. OSError: Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so
  8. Exchange与ADFS单点登录 PART 2:部署和配置ADFS
  9. vue入门实践,style和数据绑定
  10. vijos - P1279Leave-绿光(数学归纳法 + python)