将tools.jar与Java应用程序包一起分发是否安全?

时间:2014-03-10 16:23:57

标签: java jvm openjdk sun tools.jar

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

2 个答案:

答案 0 :(得分:4)

简答:无法从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,您必须使用包含tools.jar的“javac字节码编译器”重新分发整个 Oracle JDK或整个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,带有Classpath Exception。 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不存在则显示消息,否则以编程方式将其添加到类路径中。

Shishir

答案 1 :(得分:3)

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