背景
2023年4月16日,Oracle发布了新的JDK 8的更新,版本号为8u211和8u212。与以往不同的是,新版本的许可协议从BCL换成了OTN , 不能在生产环境使用这个版本,需要付费。
BCL协议,即Oracle Binary Code License Agreement,协议规定你可以使用JDK,但是不能进行修改。私用和商用都可以,但是JDK中的某些商业特性,是需要付费才可以使用的。
OTN协议,即Oracle Technology Network License Agreement,目前新发布的JDK用的都是这个协议,可以私用,商用需要付费。
OpenJDK是一个基于GPLv2+CE协议的开源JDK实现,他由OpenJDK社区来运作,作为OpenJDK社区的主导者,Oracle也在尽量减小OpenJDK和Oracle JDK的差别,将一些商业特性移植到了OpenJDK上,比如Java Flight Recorder,Java Mission Control和ZGC等等。
对于普通开发者,两者差异可忽略不计。 OpenJDK同样会每6个月发布一个新版本,不过每次新的版本发布后,旧的就不维护了,比如OpenJDK 12发布之后,11版本便停止更新,停留在11.0.2版本,没有LTS一说了。
除了Oracle的OpenJDK,还有很多免费OpenJDK实现可以用,比如 Zulu,AdoptOpenJDK,Amazon的Corretto和阿里巴巴的dragonwell等等。
- 什么是OpenJDK?
- JDK和OpenJDK的区别
OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源 ”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。
Oracle JDK采用了商业实现,而OpenJDK使用的是开源的FreeType。
Oracle JDK中还会存在一些Open JDK没有的、商用闭源的功能。
| JDK Version | Type | Release Date | Highlights | Recommendation |
|---|---|---|---|---|
| 8 | LTS | 03/2014 | Lambdas | Last LTS version under previous release model. Free updates by Oracle ended, but still maintained by others. Upgrade to a 11 or 17 within the next months! |
| 9 | Feature | 09/2017 | Modules | New release model was introduced. EOL. Upgrade to 11 or 17 now! |
| 10 | Feature | 03/2018 | var | EOL. Upgrade to 11 or 17 now! |
| 11 | LTS | 09/2018 | New HTTP Client | Upgrade to 17 now! |
| 12 | Feature | 03/2019 | EOL. Upgrade to 17 now! | |
| 13 | Feature | 09/2019 | EOL. Upgrade to 17 now! | |
| 14 | Feature | 03/2020 | Switch expressions | EOL. Upgrade to 17 now! |
| 15 | Feature | 09/2020 | Text blocks | EOL. Upgrade to 17 now! |
| 16 | Feature | 03/2021 | Records | EOL. Upgrade to 17 now! |
| 17 | LTS | 09/2021 | Sealed Classes | Current LTS version. Update to 17.0.3+ now! |
| 18 | Feature | 03/2022 | UTF-8 by Default | Stick to 17! It is a short term release without significant features. You might want to check if you run in any issues with “UTF-8 by Default” by setting -Dfile.encoding=UTF-8 in your current JDK. |
| 19 | Feature | 09/2022 | Preview and incubator features, only | Stick to 17! If you upgraded to 18 before, upgrade now to 20. |
| 20 | Feature | 03/2023 | Preview and incubator features, only | Stick to 17! If you upgraded to 19 before, upgrade now to 20. |
Oracle JDK vs OpenJDK
Oracle JDK 是由Oracle公司研发的,是Sun许可证,是基于Java标准版规范实现。它支持多操作系统,可以跨平台操作,而且是完全基于Java语言。Oracle JDK 是以包含多种组件作为库的形式的编程工具集合。 penJDK是在Java SE平台版的开源和免费实现的,由Sun Corporation从2006年开发的,它是基于C++和Java语言编写的,同样支持多平台操作系统,可跨平台操作。
OpenJDK是在Java SE平台版的开源和免费实现的,由Sun Corporation从2006年开发的,它是基于C++和Java语言编写的,同样支持多平台操作系统,可跨平台操作。
OpenJDK其实是一个完全开源的参考模型,但是Oracle JDK是OpenJDK的一个实现,而且不是完全开源的;
Oracle JDK 比 OpenJDK 更稳定。Oracle JDK 和 OpenJDK二者的实现代码基本相同,但是Oracle JDK有更多的类和错误修复;
相对于JVM性能和响应性方面,Oracle JDK 比OpenJDK提供了更好的性能; Oracle JDK不会给即将发布的版本提供长期维护支持,开发者每次都需要通过更新到最新版本来获得支持最新版本的支持内容;
Oracle JDK是根据二进制代码许可协议来获得许可,但是OpenJDK则是通过GPL v2许可来获得许可。
GPL V2 : 可以复制、发布本许可证,但不可以修改。 主打自由软件
JDK和OpenJDK的区别
OpenJDK的机器上,输入“java -version”显示的是OpenJDK
1.授权协议的不同
OpenJDK采用GPL V2协议发布,而JDK则采用JRL协议发布。两个协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。
2.OpenJDK只包含最精简的JDK
OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP……,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。
3.OpenJDK源代码不完整
这个很容易想到,在采用GPL协议的OpenJDK中,SUN JDK的一部分源代码因为产权的问题无法开放OpenJDK使用,其中最主要的部分就是JMX中的可选元件SNMP部分的代码。
因此这些不能开放的源代码将它作成plug,以供OpenJDK编译时使用,你也可以选择不要使用plug。
而Icedtea则为这些不完整的部分开发了相同功能的源代码(OpenJDK6),促使OpenJDK更加完整。
javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAl...
3.分析:没见过这个错误,之前发送都是可以的,现在不行,有一个ssl,难道是https证书什么的改了?立刻在必应搜索这条错误问题。
4.首先查看:stackoverflow.com给的410个赞的解答:
This bizarre message means that the truststore you specified was:
empty,
not found, or
couldn't be opened (due to access permissions for example).
5.看不太懂。继续搜索,找到了一个中文的解答:blog.csdn.net/qq_33382113…
6.立刻去看了一下jdk,通过自启动脚本里面设置的JAVA_HOME变量,发现之前使用的openjdk的目录不存在,换成了官方的jdk,应该是被其他人卸载掉,重装了。
7.立刻反应给对接人员,询问是否有人动过服务器,修改了JDK。
8.一边着手解决这个问题,修改了环境变量,重启了中转程序,观察短信接口的调用。发现错误消失,程序调用短信接口,短信提供商接口调用返回预期结果。
9.解决完毕。
分析:
1.根据csdn博客的解决方案,说是ssl支持的相关证书包不存在。猜测是程序按照之前的路径去找ssl调用的证书包,找不到,因此报这个错误。
反思和收获:
1. 如果多人在使用服务器跑java程序,不要轻易的去改动java环境,实在需要修改,一定要通知相关人员。尤其是在生产环境上!!!