linux ubuntu 14. 04下 OpenJdk7编译

一、下载源码。
1.1 安装Mercurial , apt-get install mercurial
1.2 下载源码 hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev or http://hg.openjdk.java.net/jdk7/jdk7
执行
cd jdk7u-dev
chmod 755 get_source.sh
./get_source.sh 或 sh ./get_source.sh

二、安装依赖
2.1 执行
apt-get install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils ant libmotif3 libmotif-dev

三、 切换jdk版本
update-alternatives –install /usr/bin/java java /usr/java/jdk1.8.0_144/bin/java 300 添加自定义jdk
update-alternatives –config java

四 编译环境
参考《深入理解Java虚拟机》

#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错  
export LANG=C  

#Bootstrap 本机JDK的安装路径。必须设置。   
export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-amd64

#允许自动下载依赖  
export ALLOW_DOWNLOADS=true  

#并行编译的线程数,设置为和CPU内核数量一致即可  
export HOTSPOT_BUILD_JOBS=4  
export ALT_PARALLEL_COMPILE_JOBS=4  

#比较本次build出来的映像与先前版本的差异。这个对我们来说没有意义,必须设置为false,否则sanity检查会报缺少先前版本JDK的映像。如果有设置dev或者DEV_ONLY=true的话这个不显式设置也行。   
export SKIP_COMPARE_IMAGES=true  

#使用预编译头文件,不加这个编译会更慢一些  
export USE_PRECOMPILED_HEADER=true  

#要编译的内容  
export BUILD_LANGTOOLS=true   
#export BUILD_JAXP=false  
export BUILD_JAXWS=false   
#export BUILD_CORBA=false  
export BUILD_HOTSPOT=true   
export BUILD_JDK=true  
export DISABLE_HOTSPOT_OS_VERSION_CHECK=ok  


#要编译的版本  
#export SKIP_DEBUG_BUILD=false  
#export SKIP_FASTDEBUG_BUILD=true  
#export DEBUG_NAME=debug  

#把它设置为false可以避开javaws和浏览器Java插件之类的部分的build。   
BUILD_DEPLOY=false  

#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖,但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了。  
BUILD_INSTALL=false  

#编译结果所存放的路径  
export ALT_OUTPUTDIR=/vsftp/openjdk7 

#这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些“”诡异的事情”,Makefile脚本检查到有这2个变量就会提示警告“)  
unset JAVA_HOME  
unset CLASSPATH  

make  2>&1 -d | tee build.log 

注意 执行shell 和 make 在openjdk源码目录下进行。

编译成功

– Build times ———-
Target all_product_build
Start 2017-10-12 09:00:54
End 2017-10-12 09:12:31
00:00:23 hotspot
00:11:09 jdk
00:00:03 langtools
00:11:37 TOTAL———————-

root@ubuntu:/vsftp/openjdk/openjdk7/j2sdk-image/bin# ./java -version
openjdk version “1.7.0-internal”
OpenJDK Runtime Environment (build 1.7.0-internal-root_2017_10_12_08_26-b00)

五 编译期间出现问题

1、 ERROR: echo “* This OS is not supported:” 系统版本检查错误

hotspot/make/linux/Makefile 添加系统版本。

SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3%

2、ERROR: error: “__LEAF” redefined [-Werror] 头文件宏定义冲突
hotspot/src/share/vm/runtime/interfaceSupport.hpp:430:0: error: “__LEAF” redefined [-Werror]
修改 interfaceSupport.hpp 添加已下代码并保存


 #ifdef __LEAF
 #undef __LEAF
 #define __LEAF(result_type, header)                                  \
  TRACE_CALL(result_type, header)                                    \
  debug_only(NoHandleMark __hm;)                                     \
  /* begin of body */
 #endif

3、 编译过程中出现./gamma: relocation error:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.36.x86_64/jre/lib/amd64/libjava.so:symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in filelibjvm.so with link time reference 异常,解决方案:
方案a:
编辑./hotspot/make/linux/Makefile,注释掉所有的test_gamma所在行 。
方案b:
使用Oracle的jdk6(这里用的是jdk1.6.0_45)代替jdk7编译openjdk
备注

4、 ERROR error: converting ‘false’ to pointer type ‘methodOop’ [-Werror=conversion-null] 类型错误,将
return false 改成 return NULL

5、can’t cd to/NOT-SET/re 设置路径
ALT_JDK_IMPORT_PATH=/usr/lib/jvm/ java-6-openjdk-amd64
ALT_HOTSPOT_IMPORT_PATH==/usr/lib/jvm/ java-6-openjdk-amd64

6、ERROR undefined reference to ‘snd_pcm_format_**’出现一堆的
undefined 参考
http://comments.gmane.org/gmane.comp.java.openjdk.build.devel/5311

@@ -65,7 +65,7 @@
    $(MIDIFILES_export) \
    $(PORTFILES_export)

-LDFLAGS += -lasound
+OTHER_LDLIBS += -lasound

 CPPFLAGS += \
    -DUSE_DAUDIO=TRUE \

减号删除
加号增加

7、ERROR gcc: error: unrecognized command line option ‘-mimpure-text’ 高版本的gcc取消了该命令 所以注释掉即可
文件在./jdk/make/common/shared/Compiler-gcc.gmk

8、 编译过程中出现Error: time is more than 10 years from present: 1136059200000错误,解决方案:
修改CurrencyData.properties(路径:./jdk/src/share/classes/java/util/CurrencyData.properties)
修改108行:AZ=AZM;2011-12-31-20-00-00;AZN
修改381行:MZ=MZM;2011-06-30-22-00-00;MZN
修改443行:RO=ROL;2011-06-30-21-00-00;RON
修改535行:TR=TRL;2011-12-31-22-00-00;TRY
修改561行:VE=VEB;2011-01-01-04-00-00;VEF

六 只编译hotspot
1、进入源码hotspot所在目录
/vsftp/jdk/jdk7/hotspot/make
重新修改虚拟机输出目录
export ALT_OUTPUTDIR = /vsftp/hotspot/openjdk7/build
其他部分与编译openjdk一致,在/vsftp/jdk/jdk7/hotspot/make目录下,执行脚本。
编译成功
Successfully remade target file `all’.
检查版本
/vsftp/hotspot/openjdk7/build/linux_i486_compiler2/fastdebug# ./gamma
显示

This Java instance does not support a 32-bit JVM.
Please install the desired version.
JAVA_HOME must point to 32bit JDK.

如果编译出现 fatal error: sys/cdefs.h: No such file or d
# include

sudo apt-get install gcc-multilib g++-multilib

2、 如果 error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory
a 修改 /etc/ld.so.conf 文件,把当前目录加进去。具体如下

include /etc/ld.so.conf.d/*.conf
/vsftp/openjdk/openjdk7/linux_amd64_compiler2/fastdebug

b 执行 ldconfig 。
本次编译 jvmg下没有gamma 选用的是fastdebug下的, 也 可以选择 product 下的 gamma。

七 指定编译版本



export ARCH_DATA_MODEL=64 # 64 or 32

参考文章
http://cduym.iteye.com/blog/1892416
ubuntu上编译hotspot遇到的问题
http://blog.csdn.net/my_computer/article/details/37879469

自己编译JDK的时候遇到的问题记录
http://chenjingbo.iteye.com/blog/1117021

如果有什么新问题,在openjdk官方邮件列表地址里找找
http://mail.openjdk.java.net/pipermail/build-dev

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
http://www.cnblogs.com/zengkefu/p/5633342.html OpenJDK和Sun/OracleJDK 区别 与联系 首先要先明确之间,以及OpenJDK 6、OpenJDK 7、OpenJDK 7u和OpenJDK 8等项目之间是什么关系,这有助于确定接下来编译要使用的JDK版本和源码分支。 从前面介绍的Java发展史中我们了解到OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。但如果仅从“开源”字面意义(开放可阅读的源码)上看,其实Sun自JDK 1.5之后就开始以Java Research License(JRL)的形式公布过Java源码,主要用于研究人员阅读(JRL许可证的开放源码至JDK 1.6 Update 23为止)。把这些JRL许可证形式的Sun/OracleJDK源码和对应版本的OpenJDK源码进行比较,发现除了文件头的版权注释之外,其余代码基本上都是相同的,只有字体渲染部分存在一点差异,Oracle JDK采用了商业实现,而OpenJDK使用的是开源的FreeType。当然,“相同”是建立在两者共有的组件基础上的,Oracle JDK中还会存在一些Open JDK没有的、商用闭源的功能,例如从JRockit移植改造而来的Java Flight Recorder。预计以后JRockit的MissionControl移植到HotSpot之后,也会以Oracle JDK专有、闭源的形式提供。 Oracle的项目发布经理Joe Darcy在OSCON 2011上对两者关系的介绍也证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共用了大量相同的代码(如下图,注意图中提示了两者共同代码的占比要远高于图形上看到的比例),所以我们编译OpenJDK,基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值