Java版本演化历史
Java的版本历史可以追溯到1995年,以下是Java语言自诞生以来的主要版本及其关键特性:
一、早期版本
-
Java 1.0(1996年1月发布)
- 引入了Java虚拟机(JVM)和Java应用编程接口(API)。
- 包含了AWT(Abstract Window Toolkit)图形库。
-
Java 1.1(1997年2月发布)
- 增加了JAR(Java Archive)文件格式,用于打包Java类库、图像和声音等资源。
- 引入了JDBC(Java Database Connectivity)API,用于数据库连接和操作。
- 增加了JavaBeans组件模型,支持可重用软件组件的开发。
二、Java 2平台(Java 2 Platform)
-
Java 2 SE(Standard Edition)1.2(1998年12月发布)
- 引入了JIT(Just-In-Time)编译器,提高了Java程序的执行效率。
- 增加了Java Plug-In技术,允许在浏览器中运行Java小程序(Applet)。
- 提供了Java IDL(Interface Definition Language)和CORBA(Common Object Request Broker Architecture)支持,促进了Java与其他面向对象系统的互操作性。
-
Java 2 SE 1.3(2000年5月发布)
- 增加了对语音处理的支持,引入了Java Sound API。
- 提供了对Java 2D的支持,增强了图形处理能力。
- 改进了RMI(Remote Method Invocation)的通信协议,提高了远程调用的性能。
-
Java 2 SE 1.4(2002年2月发布)
- 引入了正则表达式API,提高了字符串处理的灵活性。
- 增加了NIO(New Input/Output)库,提供了非阻塞式I/O操作的支持。
- 提供了XML解析器和XSLT转换器,增强了Java对XML数据的处理能力。
三、Java SE(Standard Edition)后续版本
-
Java SE 5.0(2004年9月发布,代号Tiger)
- 引入了泛型、自动装箱和拆箱、枚举类型等语言特性,增强了Java语言的表达能力。
- 提供了元数据(注解)的支持,允许在代码中添加额外的信息。
- 引入了并发包(java.util.concurrent),提供了丰富的并发编程工具。
-
Java SE 6.0(2006年12月发布,代号Mustang)
- 提供了对脚本语言的支持,引入了脚本引擎API。
- 增加了对Web服务的支持,提供了JAX-WS(Java API for XML Web Services)和JAXB(Java Architecture for XML Binding)等API。
- 改进了垃圾收集算法,提高了Java应用的性能。
-
Java SE 7.0(2011年7月发布,代号Dolphin)
- 引入了try-with-resources语句,简化了资源管理。
- 允许在switch语句中使用字符串作为分支条件。
- 提供了对二进制字面量和下划线分隔符的支持,提高了代码的可读性。
-
Java SE 8.0(2014年3月发布,代号Spider)
- 引入了Lambda表达式和函数式接口,支持更简洁的并发编程。
- 提供了新的Date-Time API(JSR 310),改进了时间和日期的处理。
- 引入了Nashorn JavaScript引擎,允许在Java应用中运行JavaScript代码。
四、Java SE后续快速发布版本
-
Java SE 9.0(2017年9月发布)
- 引入了模块化系统(JPMS,Java Platform Module System),提高了Java应用的灵活性和可维护性。
- 允许接口包含私有方法和静态方法。
-
Java SE 10.0(2018年3月发布)
- 引入了局部变量类型推断(var关键字),简化了代码编写。
- 提供了统一的垃圾收集器接口。
-
Java SE 11.0(2018年9月发布,长期支持版本)
- 增加了对HTTP/2的支持。
- 改进了字符串处理性能。
- 提供了更多的垃圾收集器选项。
五、Java SE后续版本
-
Java SE 17及以后版本(从Java SE 9开始,Java平台每六个月发布一个新版本)
-
不断引入新特性和性能优化。
-
保持对旧版本的兼容性和向后迁移的能力。
-
Java 21(2024年发布,长期支持版本)
- 进一步完善了模式匹配(Pattern Matching),引入了switch表达式模式匹配的改进。
- 引入了虚拟线程(Virtual Threads),解决了线程创建和管理代价高昂的问题。
- 引入了新的字符串模板功能,使得字符串拼接更加直观和简洁。
- 记录模式(Record Patterns)进一步扩展,使得可以更轻松地处理Java中的Record类型。
- 引入了一系列底层性能优化,特别是针对G1和ZGC垃圾回收器的改进。
-
综上所述,Java语言自诞生以来经历了多个版本的更新和升级,每个版本都引入了新的特性和性能优化。这些更新不仅提高了Java语言的表达能力和性能,还推动了Java技术在各个领域的应用和发展。
JDK的版本号命名规范
JDK(Java Development Kit)版本号的命名规范随着Java技术的发展和版本迭代而有所变化。以下是对JDK版本号命名规范的详细解释:
一、早期JDK版本号命名规范
在Java的早期版本中,JDK的版本号采用了“1.x”的格式,其中“x”代表版本号。例如,JDK 1.0、JDK 1.1、JDK 1.2等都是这种命名方式。这种命名方式直观地表示了Java的版本更新,但随着时间的推移,为了简化版本号的表示和更直观地反映Java的版本更新,JDK的命名方式发生了变化。
二、简化后的JDK版本号命名规范
从JDK 1.5(也被称为Java 5)开始,Java的开发者社区决定采用只包含主要版本号的命名方式。这种新的命名方式去掉了“1.”前缀,直接使用版本号作为JDK的名称,如JDK 5、JDK 6、JDK 7等。这种命名方式不仅简化了版本号的表示,也使得Java的版本更新更加直观和易于理解。
三、Java 9及以后版本的JDK命名规范
从Java 9开始,Oracle改变了JDK版本号的命名规则,使其更加简洁明了。具体规则如下:
- 主版本号:表示主要的发布版本,每六个月发布一次。例如,在JDK 9、JDK 11、JDK 17中,9、11、17是主版本号。
- 次版本号(可选):如果有的话,表示次要的功能更新。但在Java 9及以后的版本中,这个数字通常不再使用,或者在某些情况下以0表示。
- 安全版本号(可选):从Java 11.0.1开始,表示安全更新。每个季度发布的安全更新都会增加这个数字。
四、其他版本号组件
除了上述主版本号、次版本号和安全版本号之外,JDK版本号还可能包含以下组件:
- 更新版本号(在早期版本中使用):表示安全更新、bug修复和性能改进。例如,在JDK 8 Update 181中,181是更新版本号。但在Java 9及以后的版本中,这个组件通常被省略。
- 构建号(可选):用于标识特定的构建。它通常与安全和修复补丁的内部版本有关。
- 预览版本号(可选):对于预览或测试版的JDK,可能会有额外的标识符,如ea表示“早期访问”(Early Access),或者rc表示“候选版本”(Release Candidate)。
五、版本号示例
- JDK 1.4.2:这是一个早期版本的JDK,其中1是主版本号(但按照新的命名规则应视为1.x系列),4是次版本号,2是更新版本号。
- JDK 5:按照简化后的命名规则,5是主版本号。
- JDK 11:同样按照简化后的命名规则,11是主版本号。
- JDK 17.0.1:在这个版本中,17是主版本号,0是次版本号(虽然在这个例子中它没有被赋予新的功能含义),1是安全版本号。
以安装文件为例:
安装文件: jdk-8u131-windows-x64.exe
安装后的版本显示:
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
SE 和LTS 代表的是什么版本
SE
SE是Standard Edition的缩写,即标准版。Java SE(Java Standard Edition)是Java平台的基础,也是开发者最常使用的Java版本。它包含了编程中最基础的核心库,如Java的基本语法、面向对象编程、集合框架、多线程、网络编程、输入输出流、JDBC(Java数据库连接)等。Java SE主要用于开发桌面和服务器应用程序,提供了一个全面的环境,支持开发人员在各平台上创建各种类型的应用。
LTS
LTS是Long-Term Support的缩写,即长期支持版本。Java LTS版本是指由Oracle官方或其他维护机构提供长期支持和维护的Java版本。这些版本在发布后会获得较长时间的官方支持,包括安全更新、bug修复和性能提升。LTS版本通常经过深入的测试和使用,具有较高的稳定性和兼容性,非常适合用于生产环境。
LTS版本的发布周期相对较长,通常每几年发布一次,以确保其稳定性和长期支持性。例如,Java 8、Java 11和Java 17都是LTS版本,它们在发布后都得到了Oracle官方或其他维护机构的长期支持和更新。
区别与联系
- 定位不同:Java SE是Java平台的标准版,提供了基础的开发环境和核心库;而LTS版本则是Java平台中经过深入测试、具有长期支持和更新的稳定版本。
- 发布周期不同:Java SE的版本更新相对频繁,以引入新特性和性能优化;而LTS版本的发布周期较长,以确保其稳定性和长期支持性。
- 适用场景不同:Java SE适用于各种类型的应用程序开发,包括桌面、服务器和移动设备等;而LTS版本则更适合用于生产环境,以确保应用程序的稳定性和安全性。
SE 和LTS 在哪出现
在目前Oracle的官方下载中, JDK21 是LTS版本, JDK23 是最新发布的SE版本。
JDK是免费的吗?
JDK 在很长一段时间都是免费使用的, 这也促成了Java语言的大力发展和养成了众多的开发者。 但在Oracle收购Sun 之后,2019年1月之后发布的Oracle JDK 8版本不再免费用于商业用途。
- 2019年4月16日当天,Oracle发布了Oracle JDK的8u211和8u212两个版本(属于JDK8系列),并从这两个版本开始将JDK的授权许可从BCL换成了OTN!也就是从这两个版本开始商用收费了。 具体费用大概是: 对于PC, 每用户每月是2.5美元,对于服务器/云部署,每个processor 每月是25美元。
- JDK11及之后新发布的JDK,都是使用OTN协议。
关于BCL 和OTN协议的详细介绍,可以参考后面补充的部分。
这个协议变化的影响是:
对于商业用途:
Oracle JDK 8 u191 是2019年1月前发布的最新版本,所以只要一直使用 JDK 8 u191 以及更早的版本,就不需付费。
从2019年1月份开始,Oracle JDK 开始对 Java SE 8 之后的版本开始进行商用收费,确切的说是 8u201/202 之后的版本。如果你用 Java 开发的功能如果是用作商业用途的,如果还不想花钱购买的话,能免费使用的最新版本是 8u201/202。
总结
- 对于个人学习和开发: 无所谓收费,都可以使用
- 对于商业用途: 也就是公司使用,或是作为软件产品的一部分免费使用的最新版本: 8u201/202。
如果要继续免费使用高版本的JDK怎么办,答案就是OpenJDK, 当然也有其他免费开源JDK实现,比如 Zulu,AdoptOpenJDK,Amazon的Corretto和阿里巴巴的dragonwell等等
OpenJDK
OpenJDK 是JDK的开放源码版本。
- OpenJDK项目始于2006年,当时SUN公司在Java One大会上宣布了对Java的开源决定和承诺。
- 2009年4月,OpenJDK正式对公众发布,并采用了GPL协议。
Open JDK 历史:
- OpenJDK 6项目 - 基于JDK 7,但经过修改后提供了Java 6的开源版本
- OpenJDK 7项目 - 2011年7月28日
- OpenJDK 7u项目 - 该项目开发Java Development Kit 7的更新
- OpenJDK 8项目 - 2014年3月18日
- OpenJDK 8u项目 - 该项目开发Java Development Kit 8的更新
- OpenJDK 9项目 - 2017年9月21日
- OpenJDK 10项目 - 2018年3月10日至20日
- OpenJDK 11项目 - 2018年9月11日至25日
Java 10开始,OpenJDK项目也将每六个月发布一次新功能。但是,OpenJDK不存在STL版本,仅支持对发布的更改,直到下一个版本发布。例如,当OpenJDK 11发布6个月后,OpenJDK 12发布时,OpenJDK 11也就不再进行支持版本更新。
OpenJDK 的地址: https://openjdk.java.net/install/
OpenJDK VS Oracle JDK
OpenJDK由Oracle,OpenJDK和Java Community开发。然而,红帽,Azul Systems,IBM,Apple Inc.,SAP AG等顶级公司也积极参与其开发。
OpenJDK具有GNU通用公共许可证(GNU GPL)是完全开源的,可以自由使用。
Oracle JDK 在响应能力和JVM性能方面要好得多。更加稳定。
总结
Java 版本历史
-
SE 标准
-
LTS 长期支持
-
JDK Beta - 1995
-
JDK 1.0 - 1996年1月
-
JDK 1.1 - 1997年2月
-
J2SE 1.2 - 1998年12月
-
J2SE 1.3 - 2000年5月
-
J2SE 1.4 - 2002年2月
-
J2SE 5.0 - 2004年9月
-
Java SE 6 - 2006年12月
-
Java SE 7 - 2011年7月
-
Java SE 8(LTS) - 2014年3月
-
Java SE 9 - 2017年9月
-
Java SE 10(18.3) - 2018年3月
-
Java SE 11(18.9 LTS) - 2018年9月
-
Java SE 12(19.3) - 2019年3月
Oracle 发布计划, 自Java SE 10以来,每6个月发布一次新版本。长期支持(LTS)版本的产品每3年发布一次。
OpenJDK是Java SE Platform Edition的免费开源实现。它最初于2007年发布,是Sun Microsystems于2006年开始开发的结果。
OpenJDK是自SE 7版以来Java标准版的官方参考实现。
协议
- BCL协议,即Oracle Binary Code License Agreement,可以使用JDK,但是不能进行修改。私用和商用都可以,但是JDK中的某些商业特性,是需要付费才可以使用。
- OTN协议,即Oracle Technology Network License Agreement,可以私用,商用需要付费。
- GNU GPL(GNU General Public License)即GNU通用公共许可协议,是一个广泛被使用的自由软件许可协议。
不同类型与版本JDK的更新的问题
为什么要更新? 因为可能会爆出一些漏洞风险。
- JDK8无法更新,存在安全性等风险
- OpenJDK 没有TLS版本,也存在没有更新的风险
解决方法:
- 一直使用OpenJDK 最新版
- 从其他地方获取OpenJDK的更新支持,比如Red Hat声明:RHEL支持OpenJDK7,8,11,支持至少6年。
补充1: BCL 和OTN协议
BCL和OTN是两种不同的协议,它们各自具有不同的特点和适用场景。以下是对这两种协议的详细解释:
一、BCL协议
- 全称:BCL协议即Oracle Binary Code License Agreement,是Oracle二进制代码许可协议。
- 主要条款:
- 允许用户使用JDK,但禁止对其进行修改。
- 允许私人和商业使用,但JDK中的某些商业特性可能需要付费才能使用。
- 适用场景:
- 适用于那些希望使用Oracle JDK进行开发,但不需要对其进行修改或定制的用户。
- 适用于那些希望将Oracle JDK用于商业用途,但愿意为某些商业特性付费的用户。
二、OTN协议
- 全称:OTN协议通常指的是Oracle Technology Network License Agreement,即Oracle技术网络许可协议。但需要注意的是,OTN在某些上下文中也可能指其他含义(如光传送网络协议),但在讨论Oracle JDK时,一般指的是前者。
- 主要条款:
- 允许用户私人和非商业使用JDK。
- 商业使用需要付费。
- 变更与影响:
- 从2019年4月16日开始,Oracle发布了新的JDK 8的更新,版本号为8u211和8u212,这些版本的许可协议从BCL换成了OTN。
- 这一变更意味着,如果用户希望在生产环境中使用这些新版本的JDK 8,就需要向Oracle付费。
- 对于个人或学习使用来说,这一变更并没有太大的影响,因为OTN协议仍然允许私人和非商业使用。
三、BCL与OTN协议的比较
- 使用范围:
- BCL协议允许更广泛的商业使用,只要用户不为某些特定的商业特性付费。
- OTN协议则对商业使用进行了更严格的限制,要求用户为商业使用付费。
- 修改权限:
- 两者都禁止用户修改JDK。
- 适用版本:
- BCL协议通常适用于Oracle JDK的早期版本。
- OTN协议则适用于从2019年4月16日开始发布的新版本JDK 8及以后的版本(具体适用版本可能因Oracle的政策调整而有所变化)。