Gradle 中的 uberJar、fatJar 和 shadowJar 有啥区别?

Posted

技术标签:

【中文标题】Gradle 中的 uberJar、fatJar 和 shadowJar 有啥区别?【英文标题】:What are the differences between uberJar, fatJar and shadowJar in Gradle?Gradle 中的 uberJar、fatJar 和 shadowJar 有什么区别? 【发布时间】:2016-02-20 03:17:31 【问题描述】:

我试图了解什么时候应该使用哪个。我知道它们都组装了所有依赖类,但是它们之间有什么不同呢?

【问题讨论】:

***.com/questions/19150811/what-is-a-fat-jar 【参考方案1】:

这些术语有时可以互换使用,但通常指的是:

Fat jar(也称为 Uber jar) - 用于描述一个 jar,该 jar 中的所有依赖 jar 中的类都直接压缩在正确的目录结构中,而不是在其他罐子里。有很好的解释here。

Shaded jar(或shaded classes)——通常是指改变classes 字节码以改变classes 的包名的过程,并且也修改它在jar 中的使用。它用于将类链接到其他类的特定版本并避免版本冲突。它可以由Maven Shade Plugin 创建。阴影 jar 不需要包含所有需要的依赖项。

gradle shadow plugin 可以生成 fat jars 和 shaded jars,对于 maven shaded 插件也是如此。我想这就是人们混合这些术语的原因。

注意:我见过将胖 jar 称为 jar 的案例,其中包含依赖项作为打包的 jar。

【讨论】:

【参考方案2】:

没有任何区别。这些术语都是彼此的同义词。

“uber-jar”一词在文档中可能更常用(以maven-shade-plugin 文档为例),但“fat-jar”也被广泛使用。

【讨论】:

不正确,除非你能解释为什么“术语”会导致额外的 gradle 插件? @MushyPeas 所有三个命令都来自一个插件。 “Uber Jar”、“Fat Jar”和“Shadow Jar”都是同一个概念,没有一个命令是gradle提供的。该问题并未询问“Shadow Jar”和“Jar”之间的区别。【参考方案3】:

Uber Jar、Fat Jar 和 Shadow Jar 是同义词。

所有三个任务都做同样的事情 - 您可以选择您个人最喜欢的术语。

【讨论】:

shadowJar 是一个额外的插件而不是同义词,它创建的 jar 与 Gradle 的 jar 任务不同。

以上是关于Gradle 中的 uberJar、fatJar 和 shadowJar 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

使用 gradle 和 intellij 为 JavaFX 构建 FatJar,得到 NoClassDefFOundError

更改 gradle 中的 fat jar 名称

Gradle:使用 Spring Boot 依赖项构建“fat jar”

使用胖 Jar 插件和 Spring Boot 应用程序构建的 Gradle 给出“应用程序启动失败”

使用 Gradle 从 jar 中排除文件

使用 ProGuard 混淆 clojure uberjars