Java历史版本
1.版本及付费问题
GPL v2+CPE:官方Blog:java 11及以后发布许可证解释,按照解释,java 11以后,openjdk和oracle jdk本质上来说是完全一致的,只不过需要付费许可证的高级特性在openjdk中是不可用的,现在如果用了,在编译时会报错。这一点很重要,也就是说,除去高级特性的部分,openJDK和oracle JDK是可以互换的。
对于java 9和10,属于过渡版本,oracle官方也只是提供了6个月的支持期,所以可以不用考虑。
怎么选择
对于需要部署jdk运行环境的企业,将不可避免的面临以下选择:
java 8:
· 要么不升级版本,只要没有关键的安全问题,就可以保持版本不变,不跟进升级。这应该是很多现有老项目的唯一选择。
· 要么选择第三方发布的可以免费使用的openJDK版本。需要付出迁移成本。
· 升级到新版本JDK,比较适合新的开发项目。
· 付费使用oracle JDK更新,属于不差钱的选择。
java 11
· 使用Oracle的openJDK,需要及时跟进版本更新,可能需要比较高的开发迁移能力。
· 使用第三方发布的JDK,取决于三方jdk的稳定性及可用度。
· 付费使用Oracle JDK。
对于纯粹的产品开发商,大多数的java产品发布时并不需要打包jdk在内,因此对于产品开发时的策略,并不太需要考虑许可协议的限制。只需要确保最终产品部署时不要依赖需要付费的高级特性或者某个特定版本,只使用openjdk兼容的部分即可。最终部署时的jdk,则完全取决于使用产品的客户的具体策略。对于大多数客户来说,免费够用应该是最佳选择。
可用的三方OpenJDK
AdoptOpenJDK,官网地址:adoptopenjdk.net,它同样支持 GPL 协议且免费。
Red Hat OpenJDK,Red Hat 通过 Red Hat Enterprise Linux「RHEL」提供 OpenJDK 的构建,这是一个付费的商业产品。
Red Hat 构建更好地集成到操作系统中,因此它不是纯粹的 OpenJDK 构建。
IBM, 为 Java 8 及更早版本提供并支持 JDK。他们还使用 OpenJ9 为 AdoptOpenJDK 构建提供商业付费支持。
Azul Zulu,官网地址:zulu.org,它的核心部分就是原汁原味的 OpenJDK
SAP, 官网地址:sap.github.io/SapMachine,SAP 根据 GPL+CE 协议为 Jdk 10 及更高版本提供 JDK。
2.Java历史版本清单
以下内容参考了维基百科https://zh.wikipedia.org/wiki/Java版本歷史
语言版本 |
发布日期 |
说明 |
主要特性 |
Java语言诞生 |
1995-5 |
|
API和ABI非常不稳定 |
JDK Beta |
1995 |
|
|
JDK1.0 |
1996-1 |
Oak(橡树) |
1996-1-23 第一个稳定的版本 解释运行,使用外挂JIT。性能差,速度慢。 |
JDK1.1 |
1997-2 |
|
JDBC; 内部类; RMI(Remote Method Invocation); 反射; Java Bean; AWT事件模型大规模重新编制; 支持国际化和Unicode; |
J2SE 1.2 J2EE |
1998-12 |
Playground(操场) Java 2企业平台 |
Java集合框架; JIT(Just In Time)编译器; 对打包的Java文件进行数字签名; JFC(Java Foundation Classes), 包括主类别中集成了Swing图像化API Java插件; Applet中添加声音支持; |
|
1999-6 |
标准版(J2SE)、企业版(J2EE)和微型版(J2ME) |
|
J2SE 1.3 J2SE 1.3 |
2000-5 |
Kestrel(红隼) |
包含了HotSpot JVM; 为支持与CORBA的选择兼容性而修改了RMI; Java命名和目录接口包含在主程序库 jar文件索引; Java Sound API; 用于实现动态代理的类; Java Platform Debugger Architecture (JPDA); |
J2SE 1.4 |
2002-02 |
Merlin(灰背隼) |
支持断言(assert 关键字); 支持正则表达式; 链式异常处理; 支持IPV6; 非阻塞I/O( Nonblocking I/O,NIO); 日志Logging API; 引入Imgae I/O API来读取和写入图片,支持JPEG、PNG等格式; 集成了XML解析器和XSLT处理器 集成安全和加密扩展组件(JCE, JSSE, JAAS); 内置了Java Web Start; 首选项Preferences API (java.util.prefs); JDBC 3.0 API; Java打印服务; |
Java SE 5.0 (J2SE1.5) |
2004-9-30 |
Tiger(老虎) 里程碑,Java编程思想.第4版基于SE 5 |
从JDK 1.0中的几百个类暴增到J2SE 5中的三千多个类,增加了若干个重要的新语言功能: 泛型; 元数据(注解); 自动装箱与自动拆箱; 类型安全的枚举; 可变参数函数; 强化 for each 循环,可使用迭代方式; 改进多线程 Java 程序的运行语义; 静态导入; 自动给RMI产生桩模块; Scanner 类别来解析来自各式各样的输入和缓冲; 异步实用具在 java.util.concurrent 包中; |
Java SE 6
|
2006-12 |
Mustang(野马) J2SE更名为Java SE J2EE更名为Java EE J2SE更名为Java SE |
支持脚本语言; JDBC 4.0 API; Java Compiler API,允许Java程序以写程序的方式选择和调用Java编译器的API; 可插拔注解; 继承Web Services,透过JAX-WS改善的网络服务支持; 将JAXB升级到版本2.0:包括StAX解析器的集成; 支持pluggable annotations (JSR 269) 改善GUI; 包含JVM改善:同步和编译器性能优化,新算法和对现有垃圾收集算法的升级以及应用程序引导性能; 增加对Native PKI, Java GSS(Generic Security Service),Kerberos和LDAP支持; 更新增强最终用户的可用性,修复很多安全漏洞;升级到HotSpot VM 11
|
|
2009-4 2010-11 |
Oracle收购SUN公司 甲骨文对Java社区的不友善,Apache扬言将退出JCP |
|
Java SE 7 |
2011-7 |
dolphin(海豚)是一个重大的更新。 2015 年 4 月前 由 Oracle 提供更新 |
支持动态语言; 64位指针压缩; switch语句块中允许以字符串作为分支条件; 钻石操作符,在创建泛型对象时应用类型推断; 数值类型可以用二进制字符串表示,并且可以在字符串表示中添加下划线; 二进制整数字面值; 在一个 catch 中捕捉多种的异常; 并发实用工具; 新的文件 I/O 程序库,引入Java NIO.2开发包; null的得自动处理。 使用 Timsort 来为集合与数组排序; 一个给Java 2D的XRender传递途径; 用于图形功能的新平台API; 增强了对新网络通信协议; 更新对XML和Unicode的支持,以符合最新标准; Java部署规则集; 修补漏洞,升级到HotSpot VM 23 |
Java SE 8(LTS) |
2014-3 |
Oracle 在 2019 年 1 月停止免费商用更新 最后延伸支持日期:2025 年 3 月 |
Lambda表达式; Stream API; Date Time API; Optional 类,解决空指针异常; Nashorn,一个 JavaScript 运行时; Java 类型上的注解; 重复注解; 无符号整数算术; 静态链接 JNI 程序库; 执行 JavaFX 应用程序; 移除了虚拟机内存管理中的永久世代; 默认方法,一个在接口里面有了一个实现的方法; 方法引用,提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码; 新的编译工具,如:类依赖分析器jdeps; |
|
2017-9 |
2018 年 3 月(由 Oracle 提供更新) |
模块系统:在Jigsaw项目中将JDK模块化,模块是一个包的容器,Java 9 最大的变化之一是引入了模块系统 REPL (JShell):交互式编程环境; HTTP 2 客户端:新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服务器推送特性; 改进的 Javadoc:Javadoc 支持在 API 文档中的进行搜索,符合兼容 HTML5 标准; 多版本兼容 JAR 包; 集合工厂方法,List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例; 在接口中使用private私有方法; 改进的 API 来控制和管理操作系统进程; 改进的 Stream API 添加了一些便利的方法; 匿名类可以使用钻石操作符; Optional 添加了很多方法,可以直接转为 stream; 多分辨率图像 API; 内置了一个轻量级的JSON API; 轻响应式流(Reactive Streams) API; AOT编译; XML Catalogs; 更多的并发更新; 响应式流的Java实现,及其部分替代品java.util.concurrent.Flow; 变量句柄; Java链接器; 高DPI图像; |
|
2018-3 |
2018 年 9 月(由 Oracle 提供更新) |
var 局部变量类型推断。 能将堆内存占用分配给用户指定的备用内存设备。 使用 Graal 基于 Java 的编译器,可以预先把 Java 代码编译成本地代码来提升效能。 实验性的基于Java的JIT编译器。这是 Linux x64 下 Graal 动态编译器的集成; 应用程序类级别数据共享; 基于时间的版本命名; 适用于G1的多线程完全垃圾回收,实现并行性来改善最坏情况下的延迟; 垃圾回收器接口; 更多的Unicode语言标签扩展; 内置根证书; 线程本地握手,ThreadLocal 握手交互在,不进入到全局 JVM 安全点 (Safepoint) 的情况下,对线程执行回调; 在可选的内存设备上申请堆内存空间; 删除本地代码头文件生成器javah; 将所有JDK分支集成到同一个版本库中; |
Java SE 11(LTS) |
2018-9 |
Oracle 不为此版本提供免费更新 AdoptOpenJDK 在 2022 年 9 月或之前停止免费更新 |
动态类文件常量; Epsilon,无操作垃圾收集器; lambda参数的局部变量语法; 低开销堆分析; HTTP Client; 支持传输层安全性TLS 1.3; 添加Java飞行记录器(JFR),其用于创建性能分析记录; 添加ZGC(一个可扩展的低延迟垃圾收集器); Nest-Based访问控制; ChaCha20和Poly1305加密算法; 移出JavaFX、Java EE、CORBA ; 弃用 Nashorn JavaScript 引擎; |
Java SE 12 |
2019-3 |
Oracle 不为此版本提供免费更新 |
Shenandoah:一个实验性的低延迟垃圾收集器 细粒度性能评审包 Switch 表达式(预览阶段) JVM Constants API 进行建模,特别是那些可从常量池加载的常量。
删除与 arm64 端口相关的所有源码,仅保留保留 32 位 ARM和一个 AArch64 平台的移植; 默认类数据共享归档 新增一个名为 Shenandoah 的垃圾回收器,它通过在 Java 线程运行的同时进行疏散 (evacuation) 工作来减少停顿; |
后续每半年发布一个版本 |
|
|
|
Java 8 与 Java 11 为当前提供支持的LTS(长期支持)版本
Java6(2005-6)到java7 经过了6年,在到Java8 经过了近3年,到Java9(2017-7)又经过了3年多,更新太慢。此后,每半年更新一版。
2017年9月,Java平台的主架构师 Mark Reinhold 发出提议,要求将Java的功能更新周期从之前的每两年一个新版本缩减到每六个月一个新版本。该提议获得了通过,并在提出后不久生效。