为什么有些应用程序使用 "fat-jar" 与普通应用程序相比?

Why do some Applications use a "fat-jar" compared to a normal one?

使用 fat-jar 与传统罐相比有什么优势?

Fat Jar 只是一个包装,它在 jar 文件中包含所有应用程序依赖项,例如:如果您的应用程序 A 属于 commons-codec-xyz.jar 那么 fat jar 的包装就像

A-fat.jar
-
|
|-your.app.A.class
|-your.app.B.class
|-org.apache.commons.codec.Foo.class

如果您的应用程序 jar 被期望成为其他人的应用程序类路径的一部分,那么它真的很难避免在运行时发生冲突

这只是管理类路径的一种更便宜的方式,因此当您启动应用程序时,您不必处理提供类路径条目的问题,您可以直接这样做

java -cp .:/path/to/A-fat.jar your.Main

更好的打包方法是将 assemble jar 压缩成具有以下结构的特定压缩格式(.zip、.tar.gz 等)

A.jar
|
|--lib/
    |
    |-A.jar (only A's classes)
    |-common-codec-xyz.jar

这样它会保持透明什么进入类路径你也可以控制类路径的顺序,但你不能将它作为库分发,其他人可以在他们的应用程序中重复使用,为此你应该使用 maven 依赖项这将处理传递依赖性

这完全取决于应用程序,但这些是一般的想法