虽然tools.jar
不是JRE中的组件,但它包含在所有主要的JDK实现中,如Oracle JDK和OpenJDK。
不是JRE的标准组件意味着当我发布使用tools.jar
的Java应用程序时,我必须将其与应用程序包一起发布或将其包含在类路径中。
我的问题是:
- tools.jar是否包含平台相关的组件,阻止它跨不同平台(Windows/Linux/OSX)分发?
- 我们已经知道Oracle JDK不允许分发
tools.jar
,但是OpenJDK呢,我们可以从OpenJDK分发tools.jar以避免许可问题吗? - 如果tools.jar不能与Java应用程序一起分发,是否有一种与平台无关的方法来确定其位置,以便将其放入类路径中?
简短的回答:您不能仅从Oracle JDK或OpenJDK重新分发tools.jar
而不重新分发整个包
详细答案如下:
在网上阅读了几篇文章后,以下是我对你的问题的发现:
tools.jar是否包含阻止它的平台相关组件从分布在不同的平台(Windows/Linux/OSX)?
没有为tools.jar
定义标准依赖项。我已经编写了一个在Unix和Windows机器上完美运行的示例程序。我已经将tools.jar
从Windows机器复制到Unix机器。一切正常。
我们已经知道Oracle JDK不允许分发tools.jar,但是OpenJDK呢,我们可以从OpenJDK避免许可问题?
- 为了分发
tools.jar
,你必须重新分发整个 Oracle JDK,或者整个JRE,只有"javac字节码编译器",其中包括tools.jar
;允许再分发与你的应用"捆绑"。 - 重新发布的JDK或JRE必须"完整且未经修改"(减去关于您可以添加和/或减去的内容的几个部分)。
- 你永远不能重新发布测试版。
- 您遵守许可证的再分发部分所涵盖的其他一般条款。
Source:我们可以重新发布Oracle tools.jar吗?Oracle JDK License: http://www.oracle.com/technetwork/java/javase/readme-142177.html#redistribution
如果tools.jar不能与Java应用程序一起分发,则是有一个独立于平台的方法来确定它的位置,以便它可以放到类路径中吗?
OpenJDK带有GNU通用公共许可证,版本2,带有Classpath例外。GPL v2许可软件的被许可人可以:
- 复制并发布程序的未经修改的源代码(第1节)
- 修改程序的源代码并发布修改后的源代码(第2节)
- 分发程序的编译版本,包括修改的和未修改的(第3条),前提是:
- 所有分发的副本(修改或未修改)都带有版权声明和排除保修(第1条和第2条)
- 所有修改的副本都是根据GPL v2 (Section 2)分发的
- 程序的所有编译版本都附有相关源代码,或提供可用的相关源代码(第3节)
您可以在The GNU通用公共许可证v2 -概述中获得更多GPL v2的详细信息
UPDATE: Locate &添加tools.jar
到classpath.
如果最终用户使用JDK运行应用程序,您将自动获得所需的tools.jar
。如果没有,则需要建议用户安装JDK
。
要通过程序检查这一点,您可以使用Eclipse JDT jar。下面的代码显示了如何在JVM中定位当前JDK/JRE的绝对路径,以及如何将JAR添加到classpath
。
IVMInstall jre = JavaRuntime.getDefaultVMInstall();
File jdkHome = jre.getInstallLocation();
IPath toolsPath = new Path(jdkHome.getAbsolutePath())
.append("lib")
.append("tools.jar");
IRuntimeClasspathEntry toolsEntry =
JavaRuntime.newArchiveRuntimeClasspathEntry(toolsPath);
toolsEntry.setClasspathProperty(IRuntimeClasspathEntry.USER_CLASSES);
来源:以编程方式启动Java应用程序
你可以在这里检查,如果tools.jar不存在,则显示消息,否则将其以编程方式添加到类路径。
Shishir
要求安装JDK并设置$JAVA_HOME不是更容易吗?将tools.jar打包到您的应用程序中似乎相当危险。然后,无论用户选择如何做,用户都有责任在$PATH上获得$JAVA_HOME。