之前好像也遇到过这事,但没怎么上心。这次因为一个项目需要使用 jdk 8,不得不去 oracle 官网下载

The Oracle JDK 8 license changed in April 2019

The Oracle Technology Network License Agreement for Oracle Java SE is substantially different from prior Oracle JDK 8 licenses. This license permits certain uses, such as personal use and development use, at no cost -- but other uses authorized under prior Oracle JDK licenses may no longer be available. Please review the terms carefully before downloading and using this product. FAQs are available here.

这段话意思是,自 2019 年 4 月 Oracle JDK 8 许可发生变化,相较于以前的许可有相当大的不同。许可证允许某些使用,比如个人使用和开发使用,无需付费 -- 而以前版本授权许可的其他使用可能不在有效。一句话,就是 jdk 8(或1.8)已经完全需要付费商用了。

jdk 11 也有类似的说明:

These downloads can be used for development, personal use, or to run Oracle licensed products. Use for other purposes, including production or commercial use, requires a Java SE subscription or another Oracle license.

但 jdk 17 和 jdk 18 都没有提到商用需付费的问题,小字部分也没有。百度了一下,确定了 oracle jdk 17 开始又可以免费使用了。

回到商用需付费的 jdk 8,使用 java --version 查看当前版本,报错:

$ java --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Unrecognized option: --version

按照网上的教程查看了 JAVE_HOME 及系统变量 path 中的 %JAVE_HOME%\bin;,都没有问题。又想着法去 下载 Open JDK 8,看是否是jdk 本身的问题。

AdoptOpenJDK 网站上面行字:

24th July 2021: AdoptOpenJDK is moving to the Eclipse Foundation and rebranding.
Our July 2021 and future releases will come from Adoptium.net

AdoptOpenJDK 已经迁移到 Eclipse 基金会并重塑,2021年 7 月和将来的发布版会来自 Adoptium.net。下载 Adoptium.net 页面上 windows x64 版本,但下到一半或者将要结束就会弹出一个弹框处理,要输入用户名和密码:

OpenJdk 下载提示输入用户名和密码

这个不是网站的会话登录,而是 github 的对象下载的许可登录。找到他的 github releases 下载源,项目顶部显示 This repository has been archived by the owner. It is now read-only.,意思是项目已经归档,目前只可读。一开始猜测是不是因为这个归档的原因,后面将迅雷下载插件取消,直接浏览器下载是 OK 的。

然后使用 OpenJDK 8 测试,java --version 依然报错,这说明大概率不是 jdk 的毛病。使用 java -h 查看 java 指令参数,发现了问题所在:

$ java -h
用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32          使用 32 位数据模型 (如果可用)
    -d64          使用 64 位数据模型 (如果可用)
    -server       选择 "server" VM
                  默认 VM 是 server.

    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 ; 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续

原来,jdk 8 查看当前版本号指令是 java -version, 而非后续版本中的 java --version。不清楚什么时候产生的思维偏差,但问题原因就是这么简单,指令错了。