openjdk编译
‘壹’ 编译openjdk总是出现这个问题,怎么解决
编译openjdk总是出现什么问题?请把问题贴出来,这样才好看
‘贰’ openjdk编译错误
JDK安装程序会把java.exe,javaw.exe,javareg.exe这3个可执行文件拷贝到winnt\system32目录下,由于winnt\system32被操作系统缺省的设置为最高优先权的PATH搜索路径,以此保证用户在命令行任何目录下可运行java.exe来启动JVM,可能是你的编程软件和浏览器不兼容造成的。
‘叁’ openJDK 编译的jar包和oracleJDK编译的能通用吗
在此,Oracle与OpenJDK之间的区别
他是从组织、开源、市场等角度比较的,我这里主要从开源、前景、相关源码底层…等等角度分析,有兴趣的朋友可以一起来建议,学习
一、前景
这里我只能抛出几个疑问点,欢迎大家一起来解决,抛出疑问
1、为什么 Docker 容器的Java环境,几乎都是 openJdk ?
2、其实ORACLE jdk是开放了大部分源码的,openJDK是开放所有源码的,迄今我所想看到的实现,在Oracle JDK中都是开放源码的,Oracle JDK没有开放的部分在哪里?
答:已解决,Oracle JDK 没有开放的源码,在openJDK中的实现,这里先说明一下,OracleJDK只开放了不到7%,后面我会摘录部分,只是部分哈,有兴趣可以安装一个OpenJDK比较一下区别
3、为什么 OpenJDK开源了 OracleJDK不想开源的东西,
二、开源
open-source,开源,这是一种共享,集智的概念
openJDK 是对外开放源码的,Oracle JDK则没有(部分开源)
三、相关底层架构,实现比较
这里就windows版本分析
3.1-1、Oracle JDK架构1
安装包就一个,如图,官网地址
在这里插入图片描述
3.1-2、Open JDK架构1
链接地址,在此
如下图
在这里插入图片描述
这里比较出 openJDK的JRE和JDK是分开放的
3.2 Oracle JDK 与 Open JDK 目录结构比较
在这里插入图片描述
这里看得出 Oracle JDK 是基于 SDK(Jar)进行版本的维护的,部分提供了源码集
OpenJDK 是基于 package 进行版本维护,提供了所有的源码集,目录更清晰,部分实现还变更于与Oracle JDK 不同的包下,后面我摘出部分事例参考
还要注意 IntelliJ IDEA 中也集成了部分的 SDK,注意开发时确保正确的开发环境
3.3 JVM
openJDK已经不显示 JVM了
在这里插入图片描述
3.4 不同的命令行操作
在这里插入图片描述
四、常用对象的不同的实现(OracleJDK源码在OpenJDK中的不同实现)
摘录部分,常用对象,这里总结会有点乱(我还没仔细地观察真正的源码区别)
4.1、Object
在这里插入图片描述
4.2、ArrayLi
‘肆’ 编译openjdk8怎么解决这两个问题
rm -f libjvm.so.1; ln -s libjvm.so libjvm.so.1; \
[ -f libjvm.so ] || { ln -s libjvm.so libjvm.so; ln -s libjvm.so.1 libjvm.so.1; }; \
if [ \"\" = \"\" ] ; then \
if [ -x /usr/sbin/selinuxenabled ] ; then \
/usr/sbin/selinuxenabled; \
if [ $? = 0 ] ; then \
/usr/bin/chcon -t textrel_shlib_t libjvm.so; \
if [ $? != 0 ]; then \
echo "ERROR: Cannot chcon libjvm.so"; \
fi \
‘伍’ java jdk 可以在 openjdk 运行吗
使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的openjdk,那么到底什么是openjdk,它与sun jdk有什么关系和区别呢?
历史上的原因是,openjdk是jdk的开放原始码版本,以GPL协议的形式放出。在JDK7的时候,openjdk已经成为jdk7的主干开发,sun jdk7是在openjdk7的基础上发布的,其大部分原始码都相同,只有少部分原始码被替换掉。使用JRL(JavaResearch License,Java研究授权协议)发布。
至于openjdk6则更是有其复杂的一面,首先是openjdk6是jdk7的一个分支,并且尽量去除Java SE7的新特性,使其尽量的符合Java6的标准。
关于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社区所希望的。
‘陆’ 如何交叉编译openjdk 使之能在arm-Linux中运行
直接下载OpenJDK8源码肯定不通过。有一个专门的移植工程:
hg clone http://hg.openjdk.java.net/aarch64-port/jdk8/
hg clone http://hg.openjdk.java.net/aarch64-port/jdk8u/
这个有时无法下载,使用:
https://github.com/AdoptOpenJDK/openjdk-aarch64-jdk8u
关于OpenJDK的编译,这个博客记录最为详细,所有问题都有解决办法:
网页链接
‘柒’ 如果在 Linux快速搭建 java openjdk 编译环境
Linux直接打个命令就装好了呀 很简单的
比如ubuntu,打sudo install openjdk-7-jdk
或者你在软件中心,点下安装按钮也行
Linux下面装软件最方便了
‘捌’ 怎么编译并调试 openjdk 源代码
环境构建需要的工具
1.cygwin 工具。这个工具的主要用处是为了在window平台上模拟出一个unix虚拟环境。
为了能够在window下编译openJDK,我们需要手动安装的工具如下:
Devel:binutils,make.
Interpreters:m4
Utils:cpio,awk,file(我在安装的过程中,没找到awk包和file包,可能是版本的问题。)
Archive:zip,unzip
System:procps
以上提供的键值对说明:(前面是文件名:包名)
2.安装编译器,我选用的编译器是VS2010,因为这个编译器中包好了windows SDK v7.0a,否则还要自己去下载这个SDK
(cygwin和vs2010安装后都会在操作系统的path环境变量中加入自己的bin目录路径,必须保证VS2010的bin目录在 cygwin的bin目录之前,因为这两个软件的bin目录中各自都有一个连接器“link.exe”,但是只有VS2010中的连接器可以完成 openJDK的编译)
3.下载一个已经编译好的JDK。
4.最后一步就是下载一个Apache ANT,JDK中的java代码部分都是使用ANT脚本进行编译的,ANT版本要求在1.6.5以上。
5.准备依赖项。
由于OpenJDK中的源码没有100%开源,但是在编译JDK的时候,我们又需要这部分闭源包,官方称为“JDK plug”。这部分闭源包可以从Source Releases页面下载。在windows平台下,其是以jar包的形式存在的。通过下面的命令就可以安装
java -jar jdk-7-ea-plug-b121-windows-i586-09_dec_1010.jar
运行后就会出现提示框,点击accept接受协议,然后安装到指定目录即可。
安装完成后建立一个环境变量“ALT_BINARY_PLUGS-PATH”,变量值为安装的JDK plug的安装路径,后面编译的时候需要它
6.安装一个大于2.3版本的FreeType,这是一个免费的字体渲染库。JDK的Swing部分和JConsole这类工具要使用到它。安装好后建立两个环境变量“ALT_FREETYPE_LIB_PATH”和“ALT_FREETYPE_HEADERS_PATH”,分别指向FreeType安装目录下的bin目录和include目录。另外还有一点官方文档没有提到但必须要做的事情是把FreeType的bin目录加入到PATH环境变量中。
7.下载Microsoft DirectX 9.0 SDK(Summer 2004),安装后大约有298MB,在微软官方网站上搜索一下就可以找到下载地址,它是免费的。安装后建立环境变量“ALT_DXSDK_PATH”指向DirectX 9.0 SDK的安装目录
8.去寻找一个名为“MSVCR100.DLL”的动态链接库,如果读者在前面安装了全套的Visual Studio 2010,那这个文件在本机就能找到,否则上网搜索一下也能找到单独的下载地址,大概有744KB。建立环境变量“ALT_MSVCRNN_DLL_PATH”指向这个文件所在的目录。如果读者选择的是VS2003,这个文件名应当为“MSVCR73.DLL”,应该在很多软件中都包含有这个文件,如果找不到的话,前面下载的“Bootstrap JDK”的bin目录中应该也有一个,直接拿来用吧。
‘玖’ 如何用Mac完美编译OpenJDK 7
1.选择OSX版本很重要。目前这里Mac版本是10.10,配置好必要信息以后就开始编,结果错误满屏。简单看过之后发现是编译C文件的时候参数有误,于是查了一下,才知道是LLVM版本太新,不兼容低版本的一些编译参数。照着上面改了点代码,但是依旧编译不过。既然高版本不行,就装个低版本的呗。由于最新的OSX不能装低版本的Xcode(装了Xcode才能装LLVM),所以去下了一个10.8的OSX装在虚拟机里,然后再装个Xcode4.4。装好Xcode以后,要手动下载LLVM安装。打开Xcode,随便建立一个空项目,然后打开Preferences,找到如下所示的地方开始安装第一步咱就这么搞定了。2.安装X11X11这玩意是unix类os使用的图形系统,10.8以前的OSX是自带的,但是从此以后就不自带了。对应于Mac,你需要装XQuartz,这个没有版本限制,去网上下最新版即可。装这个的原因是当时在编译PolicyTools的时候出现了如下错误:ld:librarynotfoundfor-lX11安装以后要为X11建立软连接sudoln-s/usr/X11/include/X11/usr/include/X113.安装freetype在linux下编译openjdk的朋友可能遇到过需要安装freetype的要求,然后安装下并将安装目录加到环境变量里就好了。但是OSX不一样,freetype单独安装实际是没用的。虽然单独安装能让编译前的检查通过,但是到后面还是会出错,至于原因我没找到。那怎么呢?实际上如果安装好X11,freetype就一起安装好了,大家可以去X11的目录里看看是否有freetype。虽然说安装了X11就自带freetype,但是编译过程中可能会出现如下错误:error:freetype/config/ftheader.h:Nosuchfileordirectory实际上就是目录问题,执行下面这句命令就好了:sudoln-s/sr/X11/include/freetype2/freetype//usr/X11/include/freetype4.配置环境变量和在Linux下编译相比,OSX的环境变量配置相对来说简单很多。只需要配置编译需要的jdk和llvm的目录就可以了。因为很多源代码都是用本机现有的jdk来编译,所以预装一个低版本的jdk是必须的,这里我们需要安装jdk6。安装好以后,找到其安装目录,并添加如下环境变量:[plain]viewplainexportALT_BOOTDIR=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home通常来说安装目录都应该在/System/Library/Java/JavaVirtualMachines目录下。如果不在的话,有个技巧可以找到。因为安装好jdk以后,系统会自动在/usr/bin下建立指向java命令的软连接,所以执行“ls-l/usr/bin/java”就能看到这个命令指向哪,然后这么顺着找下去就能找到。llvm是编译C类文件所必须的,所以要把它的所在目录添加到环境变量里。通常OSX下安装app都会把app移到Applications目录下,所以我最初安装Xcode的时候也把他移进去了,如果你把Xcode放在了别的目录,那就找到对应的目录即可。[plain]viewplainexportALT_COMPILER_PATH=/Applications/Xcode.app/Contents/Developer/usr/bin5.获取编译源码按照这上面的第三点获取源代码如果没有装hg的需要自行安装到现在为止,编译前的准备工作已经完成。我们可以先执行makesanity执行下编译前的检查。如果检查通过,先来看看具体的编译命令:[plain]viewplainmakeALLOW_DOWNLOADS=trueSA_APPLE_BOOT_JAVA=trueSKIP_DEBUG_BUILD=falseSKIP_FASTDEBUG_BUILD=falseALWAYS_PASS_TEST_GAMMA=trueHOTSPOT_BUILD_JOBS=`sysctl-nhw.ncpu`这里有两个问题:a.ALLOW_DOWNLOADS=true表示编译过程中允许下载。因为有些编译模块,比如jaxp,编译脚本中指定了需要下载特定的包。虽然我没试过设置成false会不会影响编译,但是还是推荐设置成true。但是这就带来另一个问题,下载这类包很费时间,有时候就会在那卡很长时间,所以我根据编译日志找到编译脚本中控制下载的具体命令,修改修改并且把用迅雷下的对应包放到正确目录中,然后重新编译一遍,就能顺利通过了。这一点后面我会详说。b.SKIP_DEBUG_BUILD=falseSKIP_FASTDEBUG_BUILD=false这两个表示编译出来的jdk或者hotspot是否可以debug。FASTDEBUG表示的应该是提供简单的debug功能,如果想要完整的debug,则SKIP_DEBUG_BUILD必须设置为false。不过这里提醒一点,如果想在debugjdk的时候能看到debug信息,比如变量名等,只需要SKIP_FASTDEBUG_BUILD设置为false就可以了如果这两个问题都不是问题,那么就可以按回车了。如果debug和fastdebug都是false,再加上用虚拟机编译,所以需要的时间会比较长,你也许需要找一部长一点的电影来消磨一下了。最后编译出来的结果是这样的:j2sdk-image就是自己编译出来的jdk,可以直接用了。至于其他目录下的内容,各位自己琢磨吧。现在来说下ALLOW_DOWNLOADS=true引起的问题。但是遇到下载很久的包总共有三个:jaxp145_01.zip、jdk7-jaf-2010_08_19.zip、jdk7-jaxws2_2_4-b03-2011_05_27.zip之前说过可以修改编译脚本跳过下载并且用我们已经下载好的,但是实际编译过程中,这三个包对应的的编译脚本是动态生成的,所以只能等到他卡在那了,才能停下来并找到脚本修改之。因此因为这三个包,总共需要停3次。,比起一直卡在那好太多了。假设编译的是普通版本,即非DEBUG和非FASTDEBUG。下面以jaxp145_01.zip为例子讲一下怎么修改对应脚本:脚本所在位置:openjdk根目录/build/macosx-universal/jaxp/build/xml_generated/build-drop-jaxp_src.xml
‘拾’ 我为什么要自己编译openjdk8以及那些坑
(1)/etc/profileexportJAVA_HOME=/usr/java/jdk1.7.0_67-cloudera/exportPATH=$PATH:$JAVA_HOME/binexportJRE_HOME="$JAVA_HOME/jre"exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/rt.jar修改完成后,使用source/etc/profile命令进行更新;(2)下面这几步比较重要,因为在许多linux系统中都预装了openjdk,所以即使上面进行了这些设置,系统默认的还不是我们要设置的内容;如果要真正使用我们自己的jdk,还需要一下步骤:sudoupdate-alternatives--install/usr/bin/javajava/usr/java/jdk1.7.0_67-cloudera/bin/java300sudoupdate-alternatives--install/usr/bin/javacjavac/usr/java/jdk1.7.0_67-cloudera/bin/javac300(这里的300只是标识一下,没什么意义,只是下一步要用到)(3)大功告成,使用java-version命令来查看我们的java环境变量,显示如下内容:javaversion"1.7.0_05"Java(TM)SERuntimeEnvironment(build1.7.0_05-b06)JavaHotSpot(TM)ServerVM(build23.1-b03,mixedmode)*对于更新一个/usr/bin/xxx命令指向一个新的路径可以用sudoupdate-alternatives--configxxx