首页 > 解决方案 > 有没有办法询问 JVM/JRE 的许可证?

问题描述

Oracle 更改了其 Java 版本的许可证:

我想 Java 7 及以下的所有 Oracle 版本都是 OBCL;我不确定该旧许可证下是否有任何 Oracle Java 9+ 版本。

当然,其他 Java 发行版(OpenJDK 等)还有其他许可证。

有没有办法让正在运行的程序确定底层 JVM/JRE 的许可证?动机:当用户在特定许可证的 JVM/JRE 上使用我的程序时,我想警告我的程序用户。

我一直无法找到包含此信息的任何标准系统属性,并且我还查看了构成 JRE 的 JAR 的清单。

有几个地方提供对 Java 版本的结构化访问:

前者没有详细说明更新号,后者仅在 Java 9+ 中可用。无论如何,两者仍然需要一些其他资源来将已知的 Java 版本映射到各自的许可证。

另外:我知道 Oracle 最新建议将 JRE 与一个应用程序捆绑在一起,并且可以通过这种方式避免这个问题。

标签: java

解决方案


${java.home}/许可

Oracle Java 7 和 8 包含一个文件${java.home}/LICENSE. 对于 1.7.0_80 和 1.8.0_152,内容为:

请参考http://java.com/license

在 6 次 HTTP 重定向之后,当前指向https://www.oracle.com/downloads/licenses/binary-code-license.html,其中描述了“Java SE 平台产品和 JavaFX 的Oracle 二进制代码许可协议”。

${java.home}/LICENSE在 Oracle Java 1.8.0_221 中说:

请参考https://java.com/bc_license

在 3 次 HTTP 重定向之后,当前指向https://www.oracle.com/downloads/licenses/javase-license1.html,其中描述了“ Oracle Java SE 的Oracle 技术网络许可协议”。

${java.home}/LICENSE在 Oracle Java 1.8.0_251 中说:

请参考https://java.com/otnlicense

Oracle 和 OpenJDK Java 版本 9+ 不提供${java.home}/LICENSE.

${java.home}/发布

所有 Java 版本都有一个文件${java.home}/release,对于 Oracle Java 11 如下所示:

BUILD_TYPE="commercial"
IMPLEMENTOR="Oracle Corporation"
...

这适用于 Ubuntu 的 openjdk-11-jre-headless 包(版本 11.0.4+11-1ubuntu2~18.04.3):

IMPLEMENTOR="Ubuntu"
...

Ubuntu 软件包没有任何BUILD_TYPE价值。

从 java.net 下载的其他结果:

jre-8u221-linux-i586.tar.gz 和 jdk-8u251-linux-i586.tar.gz :

BUILD_TYPE="commercial"

jdk-9+181_linux-x64_ri.zip:

IMPLEMENTOR="N/A"

serverjre-9_linux-x64_bin.tar.gz(java -versionbuild 9+181):

BUILD_TYPE="commercial"
IMPLEMENTOR="Oracle Corporation"

openjdk-10+44_linux-x64_bin_ri.tar.gz:

IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION_DATE="2018-03-20"

jdk-10_linux-x64_bin_ri.tar.gz(java -versionbuild 10+44):

IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION_DATE="2018-03-20"

openjdk-11+28_linux-x64_bin.tar.gz:

IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION_DATE="2018-09-25"

jdk-11.0.4_linux-x64_bin.tar.gz:

BUILD_TYPE="commercial"
IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION_DATE="2019-07-16"

openjdk-12.0.2_linux-x64_bin.tar.gz:

IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION_DATE="2019-07-16"

通过 oracle-java7-installer 和 oracle-java8-installer 软件包在 Ubuntu 上安装的 Oracle Java 7 和 8 还提供${java.home}/release,包含:

BUILD_TYPE="commercial"

${java.home}/legal/java.base/LICENSE

Java 9+ 发行版包含一个${java.home}/legal目录。检查${java.home}/legal/java.base/LICENSE

  • openjdk-9+181_linux-x64_ri.zip:GPLv2 + 类路径异常
  • jdk-9+181_linux-x64_ri.zip:GPLv2 + 类路径异常
  • serverjre-9_linux-x64_bin.tar.gz:“请参考http://java.com/license
  • openjdk-10+44_linux-x64_bin_ri.tar.gz:GPLv2 + 类路径异常
  • jdk-10_linux-x64_bin_ri.tar.gz:GPLv2 + 类路径异常
  • openjdk-11+28_linux-x64_bin.tar.gz:GPLv2 + 类路径异常(legal/*/LICENSE相同)
  • jdk-11.0.4_linux-x64_bin.tar.gz:“请参考https://java.com/otnlicense ”(legal/*/LICENSE相同)
  • openjdk-12.0.2_linux-x64_bin.tar.gz:GPLv2 + 类路径异常

Ubuntu 的 openjdk-11-jre-headless 11.0.4+11-1ubuntu2~18.04.3 不提供${java.home}/legal/*/LICENSE.

概括

奇怪的是,看起来“https://java.com/bc_l icense${java.home}/LICENSE很好地表明了OTN许可的JRE。我认为对于 2019 年 3 月 16 日之后的 Oracle 版本,将 URLLICENSE从“ http://java.com/license ”更改为“https://java.com/bc_license”是一个错误;他们应该将其更改为“https://java.com/otn license ”。他们的补救措施是让https://java.com/bc_license重定向到 OTN 文档。

${java.home}/legal/java.base/LICENSE包含“请参阅https://java.com/otnlicense ”时,一个强烈的提示是。

较弱的提示是以下组合:

  • IMPLEMENTOR="Oracle Corporation",
  • BUILD_TYPE="commercial", 和
  • JAVA_VERSION_DATE="2019-04-16"或更晚。

不过,欢迎提供更强大的答案!


推荐阅读