在2006年11月13日的javaone大会上,sun公司宣布最终会将java开源,并在随后的一年多时间内,陆续将jdk的各个部分在gpl v2(gnu general public license v2)协议下公开了源码,并建立了openjdk组织对这些源码进行独立管理。除了极少量的产权代码(encumbered code,这部分代码大多是sun本身也无权限进行开源处理的)外,openjdk几乎包括了sun jdk的全部代码,openjdk的质量主管曾经表示,在jdk 1.7中,sun jdk和openjdk除了代码文件头的版权注释之外,代码基本上完全一样,所以openjdk 7与sun jdk 1.7本质上就是同一套代码库开发的产品。
2006年11月13日,sun microsystems正式开源java。事实上java的源代码在发布第一天就可以访问,这一策略帮助java在早年推动了平台的建立。
java之父james gosling称,他们公开源代码的意图是让社区帮助进行安全分析、bug报告、增强性能、了解偏僻个案等。java最早使用的许可证允许内部使用源代码但不能分发。
ibm当时呼吁将java捐给apache软件基金会,使用apache许可证分发,但sun最终决定在gpl许可证下开源java。gpl许可证要求衍生版本需要公开分发。gosling称这能让java更好的适应开源社区。sun在2010年被甲骨文收购,java也落到了甲骨文手中,由甲骨文主导java的演化。
jdk 1.6发布以后,由于代码复杂性的增加、jdk开源、开发javafx、经济危机及sun收购案等原因,sun在jdk发展以外的事情上耗费了很多资源,jdk的更新没有再维持两年发布一个主版本的发展速度。jdk 1.6到目前为止一共发布了37个update版本,最新的版本为java se 6 update 37,于2012年10月16日发布。
openjdk原是sunmicrosystems公司为java平台构建的java开发环境(jdk)的开源版本,完全自由,开放源码。sun microsystems公司在2006年的javaone大会上称将对java开放源代码,于2009年4月15日正式发布openjdk。甲骨文在 2010 年收sunmicrosystem之后接管了这个项目。
java在发行过程中分为了openjdk和sun/oracle jdk两种。
关于jdk和openjdk的区别,可以归纳为以下几点:
授权协议的不同:
openjdk采用gpl v2协议放出,而jdk则采用jrl放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于gpl v2允许在商业上使用,而jrl只允许个人研究使用。
openjdk不包含deployment(部署)功能:
部署的功能包括:browser plugin、java web start、以及java控制面板,这些功能在openjdk中是找不到的。
openjdk源代码不完整:
这个很容易想到,在采用gpl协议的openjdk中,sun jdk的一部分源代码因为产权的问题无法开放openjdk使用,其中最主要的部份就是jmx中的可选元件snmp部份的代码。因此这些不能开放的源代码将它作成plug,以供openjdk编译时使用,你也可以选择不要使用plug。而icedtea则为这些不完整的部分开发了相同功能的源代码(openjdk6),促使openjdk更加完整。
部分源代码用开源代码替换:
由于产权的问题,很多产权不是sun的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用free type代替。
openjdk只包含最精简的jdk:
openjdk不包含其他的软件包,比如rhino java db jaxp……,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。
不能使用java商标:
这个很容易理解,在安装openjdk的机器上,输入“java -version”显示的是openjdk,但是如果是使用icedtea补丁的openjdk,显示的是java。(未验证)
总之,在java体系中,还是有很多不自由的成分,源代码的开发不够彻底,希望oracle能够让jcp更自由开放一些,这也是所有java社区所希望的。
到这里,基本上明白了java为什么会有开源还是闭源的争执,也知道了出现误解的原因。我个人感觉java还是属于开源的,只是开源的程度没有达到百分百。
oracle/sun jdk里面包含的jvm是hotspotvm,hotspot vm只有非常非常少量的功能没有在openjdk里,那部分在oracle内部的代码库里。这些私有部分都不涉及jvm的核心功能。所以说,oracle/sun jdk与openjdk其实使用的是同一个代码库。
从一个oracle内部员工的角度来看,当他要构建oraclejdk时,他同样需要先从http://hg.openjdk.java.net签出openjdk,然后从oracle内部的代码库签出私有的部分,放在openjdk代码下的一个特定目录里,然后构建。
值得注意的是,oracle jdk只发布二进制安装包,而openjdk只发布源码
以上就是java是开源的么?的详细内容。