编译和调试openjdk8
IDE:Netbeans 8.2(最新版本即可) 操作系统:Ubuntu 14.04 (内核3.13.0) make版本:3.81 源代码:OpenJDK 8
编译OpenJDK 8
下载源代码
我是直接下载打包好的源代码(使用hg下载还需要再安装hg,这个东西相对来说还是太小众了),地址在这里
环境配置
唯一需要注意一点的就是Bootstrap JDK
的版本需要低于要编译的JDK的版本。即如果要编译OpenJDK 8,那么Bootstrap JDK
的版本需要为7。
依赖安装没有必要复制别人的,你完全可以运行bash ./configure
文件,它会提示你哪些依赖没有安装。反复执行几次,直至成功。
如果你是编译OpenJDK 8,那么环境变量部分也可以直接忽略。这种方式是编译之前版本的方式。从OpenJDK 8开始,改为了"configure && make" style build
。
编译
make all
使用NetBeans
调试
打开项目
其实OpenJDK 8里边已经有针对NetBeans
生成好的项目文件,我们没有必要像有些文章或者书里边所说的创建新的C++项目然后导入源代码这么麻烦,直接打开即可。
路径在./common/nb_native
打开之后,注意将configuration切换为”Linux_64”
其实我们也可以略过上边的
make all
,用NetBeans
打开后直接编译。效果是一样的。
容易遇到的问题
文章NetBeans 调试 openjdk8里边提到,需要在构建命令后边加上参数DEBUG_BINARIES=true
。经过实际测试发现,加不加这个都不会影响调试,所以可以忽略这个参数。
像很多文章中所举的例子,调试java
程序。这时需要选对可以调试的程序,我们需要选取./build/linux-x86_64-normal-server-release/jdk/bin
下的可执行程序,而不是./build/linux-x86_64-normal-server-release/images
下的子目录里边的可执行程序。因为后者是release模式编译的,无法触发断点调试。
高版本编译遇到的问题
我在Ubuntu 14.04中编译时(make版本为3.81),没有遇到问题,一次成功。 但是在Ubuntu 16.04中,遇到了好几个问题,如下。
This OS is not supported: Linux … 4.0.0-1-amd64 …
这是OpenJDK中的一个bug。它会在编译时检查Linux的内核版本,之前的检查代码没有检查4.x版本(那个时候还没有这个版本的内核),导致出错。我们只需要在对应的检查代码里加上即可。
文件hotspot/make/linux/Makefile
-SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%
+SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%
具体可以参考:
- Debian Bug report logs - #786417 openjdk-8: FTBFS: * This OS is not supported: Linux … 4.0.0-1-amd64 …
- Enable hotspot builds on 4.x Linux kernels
adjust-mflags.sh failed build with GNU Make 4.0 with -I<path contains j>
在make 4.x版本中会出现这个问题。
修改hotspot/make/linux/makefiles/adjust-mflags.sh
文件
@@ -64,7 +64,7 @@
echo "$MFLAGS"
| sed '
s/^-/ -/
- s/ -([^ ][^ ]*)j/ -1 -j/
+ s/ -([^ I][^ I]*)j/ -1 -j/
s/ -j[0-9][0-9]*/ -j/
s/ -j([^ ])/ -j -1/
s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/
如果mac(bsd)或者solaris平台上编译,则需要修改对应平台的代码。 路径将上面路径中的
linux
改为bsd
或者solaris
即可。
具体可以参考:
Running nasgen Exception in thread "main" java.lang.VerifyError
Running nasgen Exception in thread "main" java.lang.VerifyError: class jdk.nashorn.internal.objects.ScriptFunctionImpl overrides final method setPrototype.(Ljava/lang/Object;)V
解决方法,修改nashorn/make/BuildNashorn.gmk
文件,
$(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/
$(FIXPATH) $(JAVA)
- -cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes"
+ -Xbootclasspath/p:"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes"
jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D)
具体可以参考:
目前尚未搞清楚的问题
如果在高版本上编译,即使将上面遇到的问题一一解决,当运行编译出来的Java时还是会提示运行失败,错误信息如下:
fimh@ubuntu:~/Dev/openjdk/build/linux-x86_64-normal-server-release/jdk/bin$ ./java -version
Error: dl failure on line 864
Error: failed /home/fimh/Dev/openjdk/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so, because /home/fimh/Dev/openjdk/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so: undefined symbol: _ZN23G1SATBCardTableModRefBS24write_ref_array_pre_workIP7oopDescEEvPT_i
看起来是链接错误…
即使将make版本换为老版本(如3.81)依然是上面的问题
所以目前暂时还是使用旧的环境进行编译:
- Ubuntu 14.04 (非14.04.5,这个版本里边内核已经为4.x)
参考
- NetBeans 调试 openjdk8
- 使用Netbeans开发调试OpenJDK中的HotSpot
- RedHat/CentOS linux 6 环境编译openJDK7
- Unbuntu_14.04编译openjdk7
- Ubuntu 14.04.3 64位环境下OpenJDK7编译
- Ubuntu 下编译OpenJDK,OpenJDk debug,OpenJDk fastdebug
- 在linux下编译openjdk7
- Mac编译OpenJDK7(8)和Eclipse调试Hotspot
- 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
- adjust-mflags.sh failed build with GNU Make 4.0 with -I
- [Linux-74] 编译jdk中遇到的一些error
- Debian Bug report logs - #786417 openjdk-8: FTBFS: * This OS is not supported: Linux … 4.0.0-1-amd64 …
- Enable hotspot builds on 4.x Linux kernels
- 如何实现make工具的降版本?
- 32位 or 64位:Apache CloudStack系统VM架构选择
- Apache CloudStack系统VM架构选择
- ASP.NET MVC Controller激活系统详解:IoC的应用[下篇]
- 使用Docker的Alluxio群集设置
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[中]:管道如何处理请求
- ASP.NET MVC Model元数据及其定制: 初识Model元数据
- 如何在企业中融入机器学习
- How ASP.NET MVC Works?
- 如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?
- “前.NET Core时代”如何实现跨平台代码重用 ——源文件重用
- 简析Linux主要应用领域及范围
- ASP.NET MVC Controller激活系统详解:默认实现
- 机器之心年度盘点:2017年人工智能领域度备受关注的科研成果
- 为什么GAC和VS引用的程序集不一致?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 lee(扫雷游戏)难度:中等-Day20200820
- 一天一大 lee(重新安排行程)难度:中等-Day20200827
- 一天一大 lee(机器人能否返回原点)难度:简单-Day20200828
- 一天一大 lee(有序链表转换二叉搜索树)难度:中等-Day20200818
- 一天一大 lee(钥匙和房间)难度:中等-Day20200831
- 一天一大 lee(最短回文串)难度:困难-Day20200829
- 一天一大 lee(预测赢家)难度:中等-Day20200901
- 一天一大 lee(反转字符串中的单词 III)难度:简单-Day20200830
- 一天一大 lee(平衡二叉树)难度:简单-Day20200817
- 一天一大 lee(组合总和)难度:中等-Day20200909
- 一天一大 lee(回文子串)难度:中等-Day20200819
- 一天一大 lee(组合)难度:中等-Day20200908
- es6学习笔记
- 一天一大 lee(图像渲染)难度:简单-Day20200816
- 一天一大 lee(前 K 个高频元素)难度:中等-Day20200907