打包具有依赖关系的.jar时的最佳方法

时间:2014-09-06 00:59:29

标签: java build

我一直致力于Java项目并使用Maven进行管理。
项目本身有许多第三方依赖,例如Box2dOpenGL ..
当我运行mvn package时,项目的自定义源代码被打包到.jar中,并且它的所有依赖项都放在名为{{1}的.jar旁边的文件夹中}}。
还会创建一个lib文件夹,其中包含binWindows平台的启动脚本。 (汇编描述符如下)。

我想知道这是打包这个基于*nix的应用程序的最佳方法吗?它是否适合公共消费? 或者单个Java会更好吗?其中包含1个文件中的所有依赖项。

uber.jar

1 个答案:

答案 0 :(得分:1)

有三种常见的方法:

  1. 创建一个包含所有依赖类和资源的超级jar。

  2. 创建一个可执行jar并使用Class-Path manifest属性指定从属jar的位置。

  3. 创建一个包装器脚本,您可以通过CLASSPATH环境变量或-cp参数指定相关jar的位置。

  4. (还有其他更复杂的方法......但我不会在这里讨论它们。)

    每种方法都有优点和缺点。

    • 使用超级jar,用户(部署者,管理员)很难使用备用版本的依赖项。 (这可以是依赖项的许可证要求 !!)

    • 使用Class-Path清单属性,存在一定程度的脆弱性。如果主jar或从属jar未安装在预期位置,则应用程序将无法运行。修复损坏/不合适的清单是非常繁琐的。

    • 使用包装器脚本方法(也可能是清单方法),您可能需要针对不同平台使用不同的脚本(或属性)。

    但正如您所看到的,没有通用的“最佳方法”。 (如果有人告诉你,他们正在做出毫无根据的假设!)