java - 有没有办法询问 JVM/JRE 的许可证?
问题描述
Oracle 更改了其 Java 版本的许可证:
- 8u201/8u202 及更早版本:Oracle 二进制代码许可 (OBCL) 协议
- 8u211/8u212 及更高版本:Oracle 技术网络 (OTN) 许可协议
我想 Java 7 及以下的所有 Oracle 版本都是 OBCL;我不确定该旧许可证下是否有任何 Oracle Java 9+ 版本。
当然,其他 Java 发行版(OpenJDK 等)还有其他许可证。
有没有办法让正在运行的程序确定底层 JVM/JRE 的许可证?动机:当用户在特定许可证的 JVM/JRE 上使用我的程序时,我想警告我的程序用户。
我一直无法找到包含此信息的任何标准系统属性,并且我还查看了构成 JRE 的 JAR 的清单。
有几个地方提供对 Java 版本的结构化访问:
- https://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/SystemUtils.html →
IS_JAVA_1_8
等。 - https://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/JavaVersion.html
- https://docs.oracle.com/javase/9/docs/api/java/lang/Runtime.Version.html
前者没有详细说明更新号,后者仅在 Java 9+ 中可用。无论如何,两者仍然需要一些其他资源来将已知的 Java 版本映射到各自的许可证。
另外:我知道 Oracle 最新建议将 JRE 与一个应用程序捆绑在一起,并且可以通过这种方式避免这个问题。
解决方案
${java.home}/许可
Oracle Java 7 和 8 包含一个文件${java.home}/LICENSE
. 对于 1.7.0_80 和 1.8.0_152,内容为:
在 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 中说:
在 3 次 HTTP 重定向之后,当前指向https://www.oracle.com/downloads/licenses/javase-license1.html,其中描述了“ Oracle Java SE 的Oracle 技术网络许可协议”。
${java.home}/LICENSE
在 Oracle Java 1.8.0_251 中说:
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 -version
说build 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 -version
说build 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"
或更晚。
不过,欢迎提供更强大的答案!
推荐阅读
- c# - 执行 HTTP 307 重定向
- javascript - 如何在javascript中对字母/数字数组进行排序
- python - 将类从线程更改为非线程
- jquery - Rails6 Link_to Delete 显示 Showview
- smtp - 尝试邮寄某些附件时,smtp::sendmessage 给出“400:来自服务器的文件过早结束”
- android - 如何通过 ADB 关闭振动(在所有应用程序中)?
- latex - !未定义的控制序列。使用 R/Rmarkdown/knitr
- xamarin.forms - “HereMaps”是否支持 Xamarin.Forms (Android/IOS/UWP) 中的室内映射实现?
- flask - Azure App Service 中的 Flask-Caching ,它使用 gunicorn 服务器
- c# - 如果集合中的任何属性有“x”字,如何过滤集合中的文档?(MongoDB 驱动程序,C#)