前IT业余买手来谈谈JDK选择和采购

前IT业余买手来谈谈JDK选择和采购

前言: 前日和几个圈内朋友分别讨论了JDK选择的事情,感觉还是挺有知道意义的,就此做了记录。

1 JDK 和JRE

Java Runtime Environment (JRE)
JRE 是java程序得运行环境, 提供 java程序运行所需得库,虚拟机和其他各种部件。 JRE简单说是一个运行环境并不包含用于开发java程序的编译器和调试器。

Java Development Kit (JDK)
JDK 是 Java程序的开发环境, 除了JRE提供的所有东东外,还包括编译器、调试器等

区别请参考:
https://stackoverflow.com/questions/11547458/what-is-the-difference-between-jvm-jdk-jre-openjdk

2 OpenJDK、OracleJDK、IBMJDK

OracleJDK 就是正统的SunJDK的延续,大多数java程序都用oracleJDK.

OpenJDK是2006年由SUN开源的,但是很多组件当时没有开源,因此openjdk并不100%兼容sun jdk, 当时sun还有计划继续开源剩下的组件, 但随着sun被oracle收购,oracle开始全球java版权大维权。自此OpenJDK的就更加得到重视,包括IBM,Apple和SAP。 目前OpenJDK的主要维护者是Redhat

IBM发展了自己的JDK,用于其特殊的硬件和操作系统中,比如 java for AS400 等。所有在IBM机器上必须跑IBM JDK。

另外还有Azul 的zing 和 zulu ,zulu是 azul和微软维护的openjdk版本, 在微软的Azure云中提供应用。 Zing是Azul维护的特殊优化的JDK,采用自有的编译器和GC算法。

3 我应该选择哪个JDK

请先考虑以下几个问题:

  1. 你需要是否需要保留JAVA5,JAVA6 时代的应用?
  2. 你需要在IBM的小型机上跑JAVA应用吗?
  3. 你需要在windows上跑JAVA应用吗?
  4. 你所在的企业是否刚刚开始IT建设?从零开始?
  5. 你是否有大规模的cassandra 或者kafka?
  6. 你是否在金融行业?
  7. 我们用centos系统,却跑的OracleJDK。。

3.1 你是否需要保留JAVA5,JAVA6 时代的应用?

因为大部分的JAVA遗留应用都是sun 时代的产物, 可以说只能选择oracle JDK

3.2 你需要在IBM的小型机上跑JAVA应用吗?

IBM AIX 或者 linux on power 上的首选是 IBM JDK , IBM 机器上只能用IBMJDK。 如果是跑WAS等IBM的中间件,那只能选择IBMjdk。 如果是AS400 环境, 那就只能选择 JAVA for 400 。 反正上了IBM的船,跟着走就是了。

3.3 你需要在windows上跑JAVA应用吗?

虽然很蛋疼, 但是确认有大量这样的情况, windows上首选的也是 Oracle JDK
当然如果你是自己开发的应用,自己组织能100%的控制自己的应用,可以考虑Open JDK
Windows的Open JDK 可以从以下三家获得:

3.4 你所在的企业是否刚刚开始IT建设?从零开始?

如果是初创企业, 互联网企业等,我相信强大一点的互联网企业肯定都是自己构建JDK了。
一般的互联网企业,推荐使用OpenJDK 。 从一开始就选择OpenJDK 能避免很多麻烦,特别是发展壮大后必然面临oracle的许可问题 。 当然还是要确保开发引用的框架、jar包不依赖于Oracle JDK 开发的,即使有依赖情况,也可以找到替换的方案,因此不必担心。OpenJDK 能帮你省掉很多钱,后面再说。

3.5 你是否有大规模的cassandra 或者kafka?

如果有可以考虑 Azul 的 Zing,不过是需要100%花钱买的。如果不想花钱还是推荐OpenJDK。

3.6 你是否在金融行业?

如果你在金融行业, 还是老实使用oracle JDK吧。 原因有三:

  • 稳定性:金融行业稳定是第一考虑, OracleJDK对bug的修复还是很快的,自身也相当稳定。
  • 兼容性:OracleJDK 在兼容性上也是最好的,特别对于历史遗留应用。另外i金融行业外包,外采购严重,很难100%控制外包商或产品供应商。因此最大兼容性是第一考虑。金融使用的中间件多数为weblogic,在和中间件的配合度上oracle JDK可以说是唯一选择(用openjdk跑weblogic,oracle是不提供支持服务的)。
  • 成本: 金融行业这点小钱还是花的起的 :D

当然金融行业也有选择OpenJDK的, 比如你是红帽的客户,或者跑JBOSS ,Drools,jBPM 等,首选OpenJDK。

3.7 我们用centos系统,却跑的OracleJDK。。。

这种情况还挺多的, 确实有点拧巴。。
大多数中小互联网公司都是centos, 一般都会选择OpenJDK。 但是, 确实也有各种原因选择OracleJDK的。
那么这种情况下,如果安全防护做的好,又没有遇到什么Bug的化就保持现状吧。

但是,如果有安全要求,并且确实遇到了问题的话,有以下三种方案选择:

  1. 买Oracle JDK补丁支持
  2. 买红帽linux(rhel) ,改centos为RHEL
  3. 全部迁移到OpenJDK

第一方案:花钱多,但是省事。
第二方案:花钱少,但是要改操作系统。
第三方案:不花钱,但是最费工。
孰重孰轻,自行考虑吧。。

4 JDK也要花钱买吗?

理论上说JDK可以免费使用。 比如你可以轻易的从oracle网站上下载JAVA 8 或 9
但是请考虑一下JAVA 6, 7 甚至5呢。 虽然还是能从oracle网站上下载,但是这些版本由于过了维护期因此不再被维护。

问题来了, 你家的应用难道都能跟着oracle一起升级吗?
想一想外包开发的,买来的应用,你的供应商都能给你升级吗?

100%的回答是:

因此你就不得不维持你的JDK大版本, 比如JAVA 6 的就一直再JAVA6上跑。
但是随着时间的推移,可能会有新的bug和安全漏洞出现,那么这些跑再老JAVA可怎么办。

这时要花钱买的东西出现了, JDK 延续支持补丁。
比如 Oracle JDK 7 现在的版本是多少? 你见过网上提供 7u151的下载吗?

    JavaSE 7_x86: update 151 patch (equivalent to JDK 7u151)

那在网上能找到的版本呢?

     Java SE Development Kit 7u80

没错, 要花钱买的正是补丁!

4 重点:如何省钱的获得Oracle JDK补丁?

那么有没有一家公司,同时提供oracle jdk 补丁 和 open jdk的补丁呢?

作为一个兼任采购的IT,这点小聪明还是有的。

我偷偷的告诉你: 只要你不蛋疼的在windows上跑JAVA,有一家可以给你同时提供 OracleJDK 和 OpenJDK.

    那就是 Redhat

购买红帽的linux订阅,理论上淘宝上买一台机器的订阅就可以了。然后我再教你如何挖红帽的墙角(下期写一写挖墙脚的方法)。

用如下命令检查订阅, 你看到了什么? 呵呵 Oracle JAVA

subscription-manager list --available --all
+-------------------------------------------+
    Available Subscriptions
+-------------------------------------------+
Subscription Name: Red Hat Enterprise Linux Server, Premium (1-2 sockets) (Up to 1 guest) (L3-only)
Provides:          Red Hat Beta
                   Oracle Java (for RHEL Server)
                   Red Hat Enterprise Linux Server
                   Red Hat Software Collections Beta (for RHEL Server)

只要你是红帽linux的订阅用户, 你就能在你的yum库中发现这个仓库:

subscription-manager repos --list | grep oracle   #在不同版本对应的名称如下
rhel-5-server-thirdparty-oracle-java-rpms 
rhel-6-server-thirdparty-oracle-java-rpms 
rhel-7-server-thirdparty-oracle-java-rpms 

从这个repo可以下载最新的oracle JDK 补丁!

激活repo rhel6

subscription-manager repos --list | grep oracle  
subscription-manager repos --enable=rhel-6-server-thirdparty-oracle-java-rpms 
yum install java-1.7.0-oracle -y # 安装oraclejdk
yum update  java-1.8.0-oracle -y # 升级打补丁

激活 rhel7

 subscription-manager repos --enable=rhel-6-server-thirdparty-oracle-java-rpms 

rhel5

# 传统方式
rhn-channel --add --channel rhel-x86_64-server-5-thirdparty-oracle-java 
# 一般用这个:
subscription-manager repos --enable rhel-5-server-thirdparty-oracle-java-rpms 

5 附录:算算账(价格都是列表价,仅供参考)

几家公司:

  • Oracle (oracle jdk)
  • Redhat (open jdk 和 oracle jdk)
  • Azul ( open jdk 和 Zing )
  • IBM (IBM JDK)

这里就不讨论IBM了, 本身买了ibm机器又有维保的都能下载。

成本对比:

供应商 预估报价 说明
oracle 十几万/台 按机器core数报价不同,每年服务费成交价的N%,如果是weblogic用户JDK补丁就免费送了
Redhat 1万元/台/ linux 红帽订阅按年付费 , 按照机器数买,其实是linux的补丁附赠JDK补丁
Azul 20万/150台/ 网站报价,不太准,也是订阅,按年付费

经供参考。