【问题标题】:Is it safe to distribute tools.jar along with a Java application bundle?将 tools.jar 与 Java 应用程序包一起分发是否安全?
【发布时间】:2023-03-22 12:57:01
【问题描述】:

虽然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 应用程序一起分发,是否有一种独立于平台的方法来确定其位置,以便可以将其放入类路径中?

【问题讨论】:

  • 我不认为你关于许可证的第二个问题是 SO 的主题 - 这里没有足够的律师,所以任何回应只会导致不必要的讨论。

标签: java jvm openjdk sun tools.jar


【解决方案1】:

简短回答:不能仅从 Oracle JDK 或 OpenJDK 重新分发 tools.jar,而不重新分发整个捆绑包。

详细答案如下:

在网上阅读了几篇文章后,以下是我对您的问题的发现:

tools.jar 是否包含阻止它的平台相关组件 从分布在不同的平台(Windows/Linux/OSX)?

没有为tools.jar 定义标准依赖项。我编写了一个在 Unix 和 Windows 机器上完美运行的示例程序。我已将tools.jar 从 Windows 机器复制到 Unix 机器。一切正常。

我们已经知道 Oracle JDK 不允许分发 tools.jar,但是 OpenJDK 呢,我们可以从中分发 tools.jar OpenJDK 以避免许可问题?

  • 为了分发tools.jar,您必须重新分发整个 Oracle JDK,或仅使用包含tools.jar 的“Javac 字节码编译器”的整个JRE;该重新分发允许与您的应用“捆绑”。
  • 重新分发的 JDK 或 JRE 必须是“完整且未经修改的”(减去一些关于您可以添加和/或减少的内容的部分)。
  • 您永远不能重新分发测试版。
  • 您遵守license 的再分发部分中涵盖的其他一般条款。

来源: Can we redistribute Oracle tools.jar? Oracle JDK 许可: http://www.oracle.com/technetwork/java/javase/readme-142177.html#redistribution

如果 tools.jar 不能与 Java 应用程序一起分发,则 有一种独立于平台的方式来确定它的位置,以便它 可以放到classpath中吗?

OpenJDK 带有 GNU 通用公共许可证,版本 2,带有类路径例外。 GPL v2 许可软件的被许可人可以:

  • 复制和分发程序未经修改的源代码(第 1 节)
  • 修改程序的源代码并分发修改后的源代码(第 2 节)
  • 分发程序的编译版本,包括修改的和未修改的(第 3 节),前提是:
    • 所有分发的副本(无论是否修改)都带有版权声明和免责声明(第 1 和第 2 节)
    • 所有修改后的副本均根据 GPL v2(第 2 节)分发
    • 程序的所有编译版本都附有相关源代码,或提供相关源代码可用的可行提议(第 3 节)

您可以在The GNU General Public License v2 - An Overview获取更多关于 GPL v2 的详细信息


更新:找到tools.jar并将其添加到类路径中。

如果最终用户使用 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);

来源:Launching Java Applications Programmatically

您可以在此处检查是否 tools.jar 不存在然后显示消息,否则以编程方式将其添加到类路径中。

希希尔

【讨论】:

  • 非常感谢,能否请您详细说明如何确定tools.jar在windows和linux上的位置,以便它可以包含在classpath中?
  • 相应地更新了答案。
  • 您可以在没有其他内容的情况下重新分发 tools.jar。这是一个单独的 repo 和发行版:在这里查看我的答案 http://opensource.stackexchange.com/questions/4569/can-we-redistribute-openjdk-tools-jar/4583#4583
【解决方案2】:

仅仅要求安装 JDK 并设置 $JAVA_HOME 不是更容易吗?将 tools.jar 与您的应用程序打包似乎相当危险。然后,用户有责任在 $PATH 上获取 $JAVA_HOME,但他们选择这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多