Executable Jar
可执行 jar 包通常意味着所有依赖的 jar 包都放在一个大的入口 jar 包中。这个入口 jar 包中包含运行时需要依赖的所有 jar 包和类文件。您可以将依赖的 jar 包直接放在入口 jar 包中
Uber Jar
有两种说法:
说法一
Uber jar 的原始单词是 Über jar,是一个德语单词,可以解释为 over 或 end,但在实际上下文中,将其翻译为 everything 可能更合适。这个术语最初是由开发人员创造的,他们认为将所有依赖项和自己的代码放入 jar 文件可以解决许多冲突。但大多数输入法很难输入 Ü,所以被称为 Uber。
说法二
很多编程语言中会把 super 叫做 uber (因为super可能是关键字), 这是上世纪80年代开始流行的,比如管superman叫uberman。
所以 uber-jar 从字面上理解就是 super-jar ,这样的jar不但包含自己代码中的class ,也会包含一些第三方依赖的jar,也就是把自身的代码和其依赖的jar全打包在一个jar里面了,所以就很形象的称其为super-jar
说法三
在 Flink 链接 中的最下面有下面字样:
uber-jar (executable jar)
也就是说:uber-jar,也就是可执行的 jar
Fat jar
Fat jar 是对 fat 和 big 的一个很好的解释:Fat jar 和 Uber jar 表示包含所有依赖包的 jar 包。
Shade jar/Shadow jar
Shade jar 就是将依赖包也打包到入口 jar 包中,并提供对 某些依赖包进行重命名 的功能。
例如,一个 Maven 项目依赖于许多第三方软件包,但要在实际打包期间 重命名一些包路径。重命名的过程在这里可以称为 Shade
为什么要重命名依赖包呢?
例如,当我们开发时还需要依赖一些第三方软件包,比如 netty,所以我们需要在实际操作中以 –javaagent 或动态附加 jar 包的形式加载我们的代理 jar 包。这里加载的代理只能是一个独立的 jar 包,因此首先,我们需要通过在 jar 包中键入我们的代理及其依赖包来构建一个 Uber jar。然后,我们需要考虑类包冲突的问题,因为代理中的依赖包类和目标 JVM 进程中的类可能会发生冲突,例如,代理依赖于 netty 4.1.58.final,而目标 JVM 进程依赖于 netty 4.0.14.final,我们的代理使用 4.0.14 中不存在的 API。此时,程序将产生找不到方法的异常,因为目标进程已加载该类,并且不会重复加载代理程序包中具有相同全限定名的类。
总结
Executable Jar、Uber Jar、Fat jar 几乎是一个意思,是不同场景下的叫法
Shade jar、Shadow jar 不重命名包路径时,与上面的jar包几乎相同
参考:
https://www.jianshu.com/p/3b7f386c5c4a
https://blog.csdn.net/dshf_1/article/details/109688798