【发布时间】:2016-07-26 14:02:11
【问题描述】:
我需要生成一个 jar 文件,该文件将被其他人用作库(我们称之为“myLib.jar”),因此该 jar 不需要是可执行的。该库依赖于其他一些第 3 方 jar,但我不希望使用“myLib.jar”的人将它们包含在他/她的 Buildpath 中。
在搜索时,我找到了OneJar,并按照页面顶部的两个步骤进行操作。
1. Download one-jar-appgen-0.97.jar
Generate application, build, and run it.
$ java -jar one-jar-appgen-0.97.jar
2. Enter project path (project name is last segment): c:/tmp/test-one-jar
Enter java package name: com.example.onejar
$ cd c:/tmp/test-one-jar
$ ant
$ cd build
$ java -jar test-one-jar.jar
test_one_jar main entry point, args=[]
test_one_jar main is running
test_one_jar OK.
Add source code to the src directory, library jars to the lib directory, and rebuild.
不幸的是,这对我不起作用,因为当我尝试在新项目中包含“myLib.jar”时,我无法使用预期的类。
所以……
Q1:OneJar 是否仅适用于可执行 jar?如果不是,我怎么能实现我上面描述的。
Q2:如果 OneJar 仅用于可执行文件,是否还有其他方法可以生成“myLib.jar”库?
PS:如果需要添加更多信息,请告诉我,以便编辑我的问题。
【问题讨论】:
-
为什么不将您自己的类打包到“myLib.jar”中,然后通知用户您的依赖项。更好的是,如果您使用 Maven 或 Gradle 等构建工具,您可以声明您的依赖项,以便当它们包含您的库时,它们会自动获取它们!
-
理想情况下,我只想分发一个没有任何依赖关系的 jar,并且除了将这个 jar 包含到 buildpath 之外,不期望用户做任何其他事情。如果这是不可能的,我可以尝试类似 maven 的东西。
-
另外,您为什么认为这是一项要求?期望您的库的用户必须在运行时依赖于他们的类路径是完全合理的。我从来没有因为一个库有依赖关系而放弃使用它。
-
您是否检查了依赖项的许可条款,以确保可以重新打包 JAR。至少对于一些开源许可证,重新打包违背了精神,如果不是许可证的文字的话。 (我正在考虑 LGPL 关于“链接”的规则......旨在让您的用户更容易使用不同版本的依赖项。)
-
当有些人想将 myLib.jar 与其他库一起使用时,您会感到头疼。假设 myLib.jar 具有依赖项 A 版本 1。其他一些库可能具有依赖项 A 版本 2。您将两个版本都强制到它们的路径中。