Answers:
OpenJDK和Oracle JDK都仅由Oracle当前创建和维护。
OpenJDK和Oracle JDK是通过TCK(Java技术认证套件)的同一Java规范的实现。
JDK的大多数供应商都是在OpenJDK之上编写的,它们做了一些调整[主要是替换许可的专有部件/替换为仅在特定OS上可用的更多高性能项目]组件,而又没有破坏TCK兼容性。
许多供应商实施了Java规范并通过了TCK。例如,IBM J9,Azul Zulu,Azul Zing和Oracle JDK。
几乎每个现有的JDK都来自OpenJDK。
正如许多人所建议的那样,许可是JDK之间的一种变化。
从JDK 11开始获得长期支持,Oracle JDK / Java SE现在将需要商业许可证。现在,您应该注意要安装的JDK,因为没有订阅的Oracle JDK可能会停止工作。资源
参考:Java虚拟机列表
对于Java 7,没有什么至关重要的。OpenJDK项目主要基于Sun捐赠的HotSpot源代码。
此外,OpenJDK被选为Java 7的参考实现,并且由Oracle工程师维护。
2012年有一个关于JVM,JDK,JRE和OpenJDK之间区别的更详细的答案,该链接链接到Oracle博客文章:
问:在OpenJDK存储库中找到的源代码与用于构建Oracle JDK的代码有什么区别?
答:非常接近-我们针对Oracle JDK的构建过程是在OpenJDK 7上构建的,仅添加了两段代码,例如部署代码,其中包括Oracle对Java Plugin和Java WebStart的实现,以及一些封闭源代码。第三方组件,例如图形光栅化程序,一些开源第三方组件,例如Rhino,以及一些零散的地方,例如其他文档或第三方字体。展望未来,我们的意图是将Oracle JDK的所有部分开源,但那些我们认为具有商业功能的部分(如JRockit Mission Control(Oracle JDK中尚不可用)),并用开源替代品替代受累的第三方组件,以实现更紧密的比价在代码库之间。
未来的主要区别是发布时间表和支持策略。
OpenJDK将每6个月发布一次功能发布,仅在下一个功能发布之前受支持。从本质上讲,这是针对开发人员的连续发行流。
Oracle JDK更面向重视稳定性的企业用户。它基于OpenJDK发行版之一,但随后获得了长期支持(LTS)。Oracle JDK已计划每3年发布一次。
来源:https : //www.oracle.com/java/java9-screencasts.html?bcid=5582439790001&playerType=single-social&size=events
对于Java 8,Oracle JDK与OpenJDK的主要区别在于:
OpenJDK是Java Standard Edition平台的开源实现,由Oracle和开放Java社区贡献。
OpenJDK是根据GPL v2许可发行的,其中Oracle JDK是根据Oracle Binary Code许可协议获得许可的。
实际上,Oracle JDK的构建过程是从OpenJDK源代码构建的。因此,Oracle JDK和OpenJDK之间没有主要的技术差异。除基本代码外,Oracle JDK还包括Oracle的Java Plugin和Java WebStart的实现。它还包括第三方封闭源和开放源组件,分别是图形光栅化器和Rhino。OpenJDK Font Renderer和Oracle JDK Flight Recorder是Oracle JDK和OpenJDK之间明显的主要区别。
有关差异的完整列表,请参见源文章:Oracle JDK与OpenJDK和Java JDK开发过程
Oracle和OpenJDK JVM相同且具有相同的GC功能(从最新版本10+开始)。在Oracle管理OpenJDK JVM之前,存在具体的差异,这使得旧的Openjdk JVM在许多环境中几乎无法使用。JVM现在相同。
包含JVM作为工具包一部分的JDK,在许可,发行和维护时间表以及JDK中包含的软件库方面有所不同。对我而言,至关重要的差异还意味着如果不存在,那些会使代码无法运行的事情。不仅是许可。
diff --brief -r openjdk oraclejdk
至关重要的是,除了Linux JDK上的其他文件外,以下文件也丢失了(因此,如果您“宣称”该代码在OpenJDK上不起作用,而在使用Javafx的OracleJDK上也是如此,那么您是正确的):
Only in jdk-10.0.1/bin: javapackager
Only in jdk-10.0.1/bin: javaws
Only in jdk-10.0.1/bin: jcontrol
Only in jdk-10.0.1/bin: jmc
Only in jdk-10.0.1/bin: jweblauncher
Only in jdk-10.0.1/lib: ant-javafx.jar
Only in jdk-10.0.1/lib: deploy
Only in jdk-10.0.1/lib: deploy.jar
Only in jdk-10.0.1/lib: desktop
Only in jdk-10.0.1/lib: fontconfig.bfc
Only in jdk-10.0.1/lib: fontconfig.properties.src
Only in jdk-10.0.1/lib: fontconfig.RedHat.6.bfc
Only in jdk-10.0.1/lib: fontconfig.RedHat.6.properties.src
Only in jdk-10.0.1/lib: fontconfig.SuSE.11.bfc
Only in jdk-10.0.1/lib: fontconfig.SuSE.11.properties.src
Only in jdk-10.0.1/lib: fonts
Only in jdk-10.0.1/lib: javafx.properties
Only in jdk-10.0.1/lib: javafx-swt.jar
Only in jdk-10.0.1/lib: java.jnlp.jar
Only in jdk-10.0.1/lib: javaws.jar
Only in jdk-10.0.1/lib: jdk.deploy.jar
Only in jdk-10.0.1/lib: jdk.javaws.jar
Only in jdk-10.0.1/lib: jdk.plugin.jar
Only in jdk-10.0.1/lib: jfr
Only in jdk-10.0.1/lib: libavplugin-53.so
Only in jdk-10.0.1/lib: libavplugin-54.so
Only in jdk-10.0.1/lib: libavplugin-55.so
Only in jdk-10.0.1/lib: libavplugin-56.so
Only in jdk-10.0.1/lib: libavplugin-57.so
Only in jdk-10.0.1/lib: libavplugin-ffmpeg-56.so
Only in jdk-10.0.1/lib: libavplugin-ffmpeg-57.so
Only in jdk-10.0.1/lib: libbci.so
Only in jdk-10.0.1/lib: libcmm.so
Only in jdk-10.0.1/lib: libdecora_sse.so
Only in jdk-10.0.1/lib: libdeploy.so
Only in jdk-10.0.1/lib: libfxplugins.so
Only in jdk-10.0.1/lib: libglassgtk2.so
Only in jdk-10.0.1/lib: libglassgtk3.so
Only in jdk-10.0.1/lib: libglass.so
Only in jdk-10.0.1/lib: libgstreamer-lite.so
Only in jdk-10.0.1/lib: libjavafx_font_freetype.so
Only in jdk-10.0.1/lib: libjavafx_font_pango.so
Only in jdk-10.0.1/lib: libjavafx_font.so
Only in jdk-10.0.1/lib: libjavafx_iio.so
Only in jdk-10.0.1/lib: libjfxmedia.so
Only in jdk-10.0.1/lib: libjfxwebkit.so
Only in jdk-10.0.1/lib: libnpjp2.so
Only in jdk-10.0.1/lib: libprism_common.so
Only in jdk-10.0.1/lib: libprism_es2.so
Only in jdk-10.0.1/lib: libprism_sw.so
Only in jdk-10.0.1/lib: librm.so
Only in jdk-10.0.1/lib: libt2k.so
Only in jdk-10.0.1/lib: locale
Only in jdk-10.0.1/lib: missioncontrol
Only in jdk-10.0.1/lib: oblique-fonts
Only in jdk-10.0.1/lib: plugin.jar
Only in jdk-10.0.1/lib: plugin-legacy.jar
Only in jdk-10.0.1/lib/security: blacklist
Only in jdk-10.0.1/lib/security: public_suffix_list.dat
Only in jdk-10.0.1/lib/security: trusted.libraries
Only in openjdk-10.0.1: man`
diff
?
根据oracle博客的说法,适用于Java 11和更高版本的Oracle JDK版本
从Java 11开始,Oracle将根据开源GNU通用公共许可证v2,带有类路径异常(GPLv2 + CPE)以及针对将Oracle JDK用作Oracle产品或服务的一部分的商业许可证,提供JDK版本,或不希望使用开源软件的人。使用开源许可证和商业许可证的这种组合取代了历史上的“ BCL ”许可证,后者具有免费和付费商业条款的组合。
每个许可证将提供不同的版本,但是这些版本除了在外观和包装上有所不同之外,在功能上是相同的,下面将详细介绍。
从BCL到GPL
十多年来,Oracle Java SE技术的二进制代码许可证(“ BCL”)一直是Oracle Java SE技术的主要许可证。BCL在某些条件下允许无许可使用。为了简化流程,Oracle开始使用与Linux平台相同的许可模型,提供Java 9以后的开放源代码许可的OpenJDK构建。如果您习惯于免费获得Oracle Java SE二进制文件,则可以继续使用jdk.java.net上的Oracle OpenJDK构建继续这样做。如果您习惯于从Oracle获得Oracle Java SE二进制文件作为商业产品或服务的一部分,那么可以继续通过My Oracle Support(MOS)和其他位置获得Oracle JDK版本。
功能相同且可互换...
从甲骨文获得BCL许可的JDK一直以来都包含OpenJDK构建中不提供的“商业功能”。但是,正如所承诺的那样,在过去的一年中,Oracle为OpenJDK社区贡献了这些功能,包括:
因此,从Java 11开始,Oracle JDK构建和OpenJDK构建将基本相同。
...但在化妆品和包装上有所不同
确实仍然存在少量差异,有些是故意的和修饰的,而有些仅仅是因为需要更多时间与OpenJDK贡献者讨论。
保持这种差异是为了为特定种类的传统使用提供一致的体验。这些模块现在可以作为OpenJFX的一部分单独使用,现在可以在OpenJDK和Oracle JDK中使用,因为它们是Oracle促成OpenJDK的商业功能(例如Flight Recorder),或者从Oracle JDK 11中删除了(例如JNLP) 。
Java 11 2018年9月25日
Java(TM)SE运行时环境18.9(内部版本11 + 28)
Java HotSpot(TM)64位服务器VM 18.9(内部版本11 + 28,混合模式)
对于OpenJDK 11构建:
openjdk版本“ 11” 2018-09-25
OpenJDK运行时环境18.9(内部版本11 + 28)
OpenJDK 64位服务器VM 18.9(内部版本11 + 28,混合模式)
可以在此博客文章中找到Oracle JDK 11和OpenJDK 11之间剩余的一些外观和包装差异的列表:
https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later
简而言之:
从Java 11转变为一大变化
甲骨文将通过开源和商业许可证的组合更改其历史“ BCL”许可证
更新:25-八月-2019
有关更多详细信息,oracle-vs-openjdk
除了明显的许可差异外,OpenJDK和OracleJDK 11之间的主要差异是稳定性和性能更新。
来源:https://www.youtube.com/watch?v = Adv9--6IcQI&t = 385
每六个月,这两个代码库将同步。但是在6个月的窗口中,OpenJDK将仅收到安全更新,而OracleJDK将收到其他稳定性和性能更新。
鉴于OpenJDK和OracleJDK的更新版本仅每3个月发布一次,这意味着您(最多)缺少3个月的修补程序,直到发布下一个主要版本并进行升级为止。但是,如果您选择坚持使用LTS版本,则商业许可开始变得更有意义。
同样对于Java 8,由AMIS Technology Blog托管在各种JVM上的响应式(非阻塞)Spring Boot REST应用程序的有趣性能基准已于2018年11月发布,显示出以下方面的差异:
有关详细信息,请参见源文章。
当然YMMV,这只是基准之一。
我的理解是Oracle JDK不能在生产中使用,因此我不能合法地(无需付费)将其用于我为公司构建的Web应用程序。我必须使用OpenJDK。如果我错了,请纠正我!从这篇文章。
从Java 11开始,Oracle JDK仅限于开发和测试环境。如果您购买了商业支持,则只能在生产中使用Oracle JDK。相反,Oracle将免费提供基于OpenJDK的Java构建,可在生产中使用。但是对于正式的Oracle JDK,真正的路线图将如下所示:
更新:我错了。我可以免费使用Oracle JDK,但是6个月后将无法获得安全更新,因此我们必须承担风险。请查看上面的链接文章部分“新版本对我的公司意味着什么?”。