为什么有些应用程序使用 "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 依赖项这将处理传递依赖性
这完全取决于应用程序,但这些是一般的想法
使用 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 依赖项这将处理传递依赖性
这完全取决于应用程序,但这些是一般的想法