Oracle JDK | Open JDK | |
来源 | Oracle团队维护 | Oracle和Open Java社区 |
授权协议 | Java 17及更高版本 Oracle Java SE 许可证Java16及更低版本甲骨文免费条款和条件 (NFTC) 许可协议 (oracle.com) | GPL v2许可证 |
关系 | 由Open JDK构建,增加了少许内容 | |
发行周期 | 6个月,每两年一个LTS | 6个月 |
是否收费 | 2021年9月起Java17及更高版本所有用户免费。16及更低版本,个人用户、开发用户免费。 | 2017年9月起,所有版本免费 |
LTS | 目前7,8,11,17 | 无,但是有社区编译的其他支持 |
对语法的支持 | 一致 | 一致 |
性能 | 最佳 | 接近,几乎无差 |
名称 | 支持团队/公司 | 说明 |
OpenJDK | Sun->甲骨文 | 原是Sun Microsystems公司为Java平台构建的Java开发环境(JDK)的开源版本,,完全自由,,开放源码 |
Zulu | Azul Systems | 需要为其面向网络的客 户提供基于服务器的Java应 用程序的公司提供服务,,或者为嵌入式和物联网用例提 供基于Java的系统 |
Liberica | BellSoft | 100% 开源Java实现。它是由BellSoft贡献的OpenJDK构建的 |
Temurin | eclipse | Adoptopenjdk自2020年7月交给eclipse,,现在改名Temurin(Adoptium.net) |
openJ9 | IBM | IBM打包的openJ9 JVM的JDK, 有区别于 Oracle HotSpot JVM , 极省内存 |
Microsoft JDK | Microsoft微软 | |
SapMachine | SAP | 是OpenJDK 项目的下游版本。它用于为希望使用OpenJDK运行其应用程序的SAP客户和合作伙 伴构建和维护支持SAP的OpenJDK版本 |
RedHat OpenJDK | RedHat | 免费的 、多平台的、面向生产的开放Java开发工具包(OpenJDK) 发行版 |
Amazon Corretto | Amazon | 阿里巴巴内部 OpenJDK 定制版AJDK 的开源版本 |
Dragonwell | 阿里巴巴 | 阿里巴巴内部 OpenJDK 定制版AJDK 的开源版本,,AJDK 为在线电商、金融、物流做了结合业务场景的优化,,运行在超大规模的,,100,000+ 服务器的阿里巴巴数据中心 |
Kona | 腾讯 | 腾讯云内部的默认 JDK,,用于云计算和其他 Java 应用程序 |
毕昇JDK | 华为 | 毕昇JDK基于OpenJDK开发,,是一个高性能、可用于生产环境的OpenJDK发行版 |
什么时候又开始免费了
2021年9月起 java 17 及更高版本所有用户免费, 16及更低版本,个人用户,开发用户免费
什么时候开始收费
Oracle JDK从2019年4月16号开始商用商用商用收费了
哪个版本开始收费
2019年4月16日当天,Oracle发布了Oracle JDK的8u211和8u212两个版本 (属于JDK8系列) ,并从这两个版本开始将JDK的授权许可从BCL换成了OTN!也就是从这两个版本开始 商用收费了!
啥叫商用收费
商用收费就是当你使用 Oracle JDK 8u211及以上版本进行具有商业用途(盈利目的)的应用或工具的开发时是要收费的,这时是要先向Oracle缴费取得授权的!当然,一开始你没缴费取得授权就直接用了,Oracle也是不知道的啦!但当你的产品应用或工具越做越大,越来越有名气和市场影响力时,说不定哪天就收到了Oracle发来的律师函,会搞得你公司不要不要的,甚至破产!
Oracle JDK的最后一个免费版本是哪个呢?
是2019年1月15日发布的Oracle JDK 8u201和8u202!
说好的 最后一个 免费版本,为什么写了两个版本号 8u201和8u202呢?我到底要用哪一个?
这就涉及到Oracle跟Oracle JDK的使用者之间的一个小小的约定或小常识了!
从 2014 年 10 月发布 Java SE 7 Update 71 (Java SE 7u71) 开始,Oracle在发布Oracle JDK关键补丁更新 (CPUs:Critical Patch Updates) 的同时一般会发布相应的补丁集更新 (PSUs:Patch Set Updates)。
Oracle JDK 关键补丁更新 (CPUs) 包含安全漏洞修复和重要漏洞修复,Oracle 强烈建议所有Oracle JDK用户及时升级到最新的 CPU 版本,Oracle JDK 关键补丁更新 (CPUs) 版本号采用 奇数编号!
Oracle JDK 补丁集更新 (PSUs) 包含相应 CPUs 中的所有修复 以及其他非重要修复,仅当您受到Oracle JDK关键补丁更新 (CPUs)版本之外的其他漏洞的影响时才应当使用相应的补丁集更新 (PSUs) ,Oracle JDK 补丁集更新 (PSUs) 版本号采用 偶数编号!
所以,一般情况下我们只要下载 奇数编号 的最新版本更新就行了!记住:商业收费版本的不要用于商业用途,这不是小事情,严重起来会让你的公司倒闭
如果你真的很烦这些收费授权的Oracle JDK (主要应该是想节约成本) ,但又想尽量跟上或用上最新的JDK功能特性,那么Oracle官方其实还提供了一个完全免费开源的JDK版本——OpenJDK
Oracle在 GPL许可下提供了开源的 OpenJDK 发行版,最新版的OpenJDK一般都会紧跟对应版本的Oracle JDK,功能特性基本没有差异!
版本 | 名称 | 发行日期 |
JDK 1.0 | Oak(橡树) | 1996-01-23 |
JDK 1.1 | Coffce(咖啡) | 1997-02-19 |
J2SE 1.2 | Playground (运动场) | 1998-12-04 |
J2SE 1.3 | Kestrel (美洲红隼) | 2000-05-08 |
J2SE 1.4 | Merlin (灰背隼) | 2002-02-13 |
Java SE 5.0 (1.5.0) | Tiger (老虎) | 2004-09-30 |
Java SE 6.0 (1.6.0) | Mustang (野马) | 2006-04 |
Java SE 7.0 (1.7.0)(LTS) | Dolphin (海豚) | 2011-07-28 |
Java SE 8.0 (1.8.0)(LTS) | Spider (蜘蛛) | 2014-03-18 |
Java SE 9.0 | 从Java 8开始开发代号已经弃用了 | 2017-09-21 |
Java SE 10.0 | 2018-03-21 | |
Java SE 11.0(LTS) | 2018-09-25 | |
Java SE 12.0 | 2019-02-07 | |
Java SE 13.0 | 2019-09-26 | |
Java SE 14.0 | 2020-03-17 | |
Java SE 15.0 | 2020-09-15 | |
Java SE 16.0 | 2021-03-16 | |
Java SE 17.0(LTS) | 2021-09-14 | |
Java SE 18.0 | 2022-03-22 | |
Java SE 19.0 | 2022-09-20 |
版本 | 开始日期 | 结束日期 | 延期结束日期 | 主要特性 |
7(LTS) | 2011年7月 | 2019年7月 | 2022年7月 | |
8(LTS) | 2014年3月 | 2022年3月 | 2030年12月 | 1. Stream API 流 2. 新的日期和时间API,LocalDate、LocalDateTime3. Lambda语法 4. 函数式接口 5. 接口可以添加非抽象方法,default关键字6. JVM移除永久代,增加元空间 |
11(LTS) | 2018年9月 | 2023年9月 | 2026年9月 | 1. 模块化 (jdk9) 2. 默认G1垃圾回收器(jdk9) 3. 局部变量类型推断(jdk10) 4. 移除Java EE(jdk11) 5. 合并javac和java命令(jdk11) |
17(LTS) | 2021年9月 | 2026年9月 | 2029年9月 | 1. 试验ZGC,需要在JVM配置()jdk11) 2. 文本块升级(jdk13)3. switch支持lambda(jdk13预览,jdk14) 4. ZGC 可用于生产环境(jdk15) 5. record(jdk14,15预览,jdk16) 6. Realed class密封类(jdk15,16预览,jdk17) 7. 统一日志支持异步日志刷新(jdk17) |
21(LTS) | 2023年9月 | 2028年9月 | 2031年9月 |
区别
Java 技术 = Java 语言 + Java 平台
Java 平台 = JVM + JDK
Java SE = JDK 根基
Java EE,JavaME,JavaFX 是 Java SE 的扩展
简单点说
Java SE 是标准版本 用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。如 Java应用程序开发平台Eclipse
Java EE 是网站开发方向的 主要针对企业应用的开发 如电子商务网站、ERP系统
Java ME 是手机方向的 主要针对消费类电子设备的 如: 蜂窝电话和可视电话、数字机顶盒、汽车导航系统 手机游戏,电视机顶盒和打印机相关的嵌入式设备软件
Java SE: Java Platform,Standard Edition 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序,包含了支持 Java Web 服务开发的类,为(Java EE)提供基础。
Java EE: Java Platform,Enterprise Edition 这个版本以前称为 J2EE。企业版帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。
Java ME: Java Platform,Micro Edition 这个版本以前称为 J2ME。为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
JavaFX: JavaFX Script 编程语言 是一种declarative, statically typed(声明性的、静态类型)脚本语言
Java EE 与 Java SE 有什么区别?
Java EE 相比于Java SE 来说,除了多出包(Package)以外,还多了若干 Java 容器,如 Tomcat、GlassFish、IBM WebSphere 等。
那么什么是 JAVA 容器呢?
以 Java EE 的子集 Servlet 为例,我们现在用 Servlet 可以相对轻松的写出一个动态 Web 站点。
JDK8与JDK1.8的区别
JDK8或者JDK1.8是由于自从JDK1.5/JDK5命名方式改变后遗留的新旧命令方式问题。所以 Java 8, JDK8或者JDK1.8也是同一个东西。
JDK、JRE、ServerJRE
Software Developers: JDK (Java SE Development Kit). For Java Developers. Includes a complete JRE plus tools for developing, debugging, and monitoring Java applications.
Administrators running applications on a server: Server JRE (Server Java Runtime Environment) For deploying Java applications on servers. Includes tools for JVM monitoring and tools commonly required for server applications, but does not include browser integration (the Java plug-in), auto-update, nor an installer.
End user running Java on a desktop: JRE: (Java Runtime Environment). Covers most end-users needs. Contains everything required to run Java applications on your system.
JDK
JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运 行Java程序的平台。JDK是整个Java的核心,包括一堆Java工具tools.jar和Java标准类库。
JRE
JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。
Server JRE
Server JRE是专为服务器端程序量身打造的, 只包含JRE/JDK中最常用的那部分功能.。为了做到简单,Server JRE不使用安装包, 而是一个绿色版的压缩文件。
从使用情况来看,服务器部署使用server jre比较好,精简了javafx一些图形界面才用到的东西
Server JRE 包括 JVM 监测工具和服务器应用程序所需的常用的工具。JRE包括浏览器集成 Java 插件。
老版本的JDK包括了JRE,但JDK8之后的版本不再包括JRE. 从JDK 6 到 JDK 10: JRE, server JRE 可以单独下载, 从JDK11 开始不再单独下载
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出