1052 2019-12-10 2020-06-25

前言:这一篇博客是用血换来的。

一、为什么要编译OpenJDK

这里有几个点:

  • 为什么要编译JDK?因为编译JDK可能会让我们对Java有更深层次的了解。

  • 为什么要编译?因为平常我们使用的JDK都是编译后的,类似于二进制jar包,所以看不到注释和源码,不能进行调试。

  • 为什么下载的源代码只有一两百兆,编译后文件却有三四个G?

  • 为什么编译需要那么多的第三方包?

对于后面两点附上别人的一些看法:“c++就是这封德行,很多库都是基于模板的,一展开就成倍增长”。

二、构建步骤

1、下载安装包

点击这里下载需要编译版本的Source Code。

2、开始构建

  1. 先查看README-build.html,这个是一定有的,可以整体构建有个把握。
  2. 运行bash ./configure --enable-debug --with-target-bits=64 --with-boot-jdk=../../jdk1.7检查,根据提示安装工具包。
  3. 当bash ./configure没有任何报错时,就可以执行make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CFLAGS_WARNINGS_ARE_ERRORS=-Wno-all。
  4. 整体应该是这个样子的
# 构建快速debug版本,bootJDK需要是上一个版本的JDK目录
hk@hk-LPC:/usr/dev/openjdk/openjdk$ bash ./configure --enable-debug --with-target-bits=64 --with-boot-jdk=../../jdk1.7

## 省略其他
====================================================
A new configuration has been successfully created in
/usr/dev/openjdk/openjdk/build/linux-x86_64-normal-server-release
using default settings.

Configuration summary:
* Debug level:    release
* HS debug level: product
* JDK variant:    normal
* JVM variants:   server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 9-internal+0-adhoc.hk.openjdk (9-internal)

Tools summary:
* Boot JDK:       openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)  (at /usr/lib/jvm/java-8-openjdk-amd64)
* Toolchain:      gcc (GNU Compiler Collection)
* C Compiler:     Version 6.3.0 (at /usr/bin/gcc)
* C++ Compiler:   Version 6.3.0 (at /usr/bin/g++)

Build performance summary:
* Cores to use:   4
* Memory limit:   11909 MB

# 忽略版本检查、忽略编译警告,整个过程耗时应该十多分钟
hk@hk-LPC:/usr/dev/openjdk/openjdk$ make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CFLAGS_WARNINGS_ARE_ERRORS=-Wno-all

3、可能出现的问题

先定个基调:所有出现的编译问题,都是版本不兼容的问题

# 问题一
Creating sa.make ... /usr/bin/make: 不适用的选项 -- / /usr/bin/make: 不适用
# 这个问题暂时无解,只能换版本。

# 问题二
error: invalid suffix on literal; C 11 requires a space between literal and...
# 这个问题是gcc版本过高,降低gcc版本或提高jdk版本,别无他法

# 问题三
cpCache.hpp:194:42: error: left operand of shift expression '(-1....
# 这个问题是gcc版本过高,降低gcc版本或提高jdk版本,别无他法

# 问题四
int readdir_r(DIR*, dirent*, dirent**)’ is deprecated -Werror=deprecated-d
# 这个问题是警告被当做错误处理,make时开启CFLAGS_WARNINGS_ARE_ERRORS=-Wno-all即可

解决办法就是换版本,根据实际情况升高或降低JDK/编译器版本,一般来说JDK8是比较好的。

三、修改源代码

1、准备工作

  • 先去netbeans官网下载8.0-all版本。
  • 再在命令行输入gdb,如果找不到命令就运行sudo apt-get install gdb,这一步很重要。

2、运行

导入C++到netbeans,并修改如下两个地方

# JavaTest是事先编译好的class
# 特定版本/参数请自行带入替换,本文展示的只是建议值
项目->属性->运行->运行命令:"${OUTPUT_PATH}" -cp ~/classes/javatest JavaTest

# 之前需关闭自动构建,这里需要告诉netbeans的构建入口
项目->属性->构建->make->构建结果:build/linux-x86_64-normal-server-fastdebug/jdk/bin/java

# java.c是源代码入口,可以在这里打断点调试
导航->转至文件:java.c

3、再编译

当修改了源代码时,直接运行是显示不出结果的,因为此时还未编译,需要重新make。

# 这次make应该最好在命令行运行,netbeans里面运行会报失败
# 这次make速度应该很快,在15s之内
hk@hk-LPC:/usr/dev/openjdk/openjdk$ make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CFLAGS_WARNINGS_ARE_ERRORS=-Wno-all

# 如下为我的编译输出(我在java.c中printf了一下)
hk@hk-LPC:/usr/dev/openjdk/openjdk/build/linux-x86_64-normal-server-fastdebug/jdk/bin$ ./java -version
Compiled by hk on 2019-12-10
openjdk version "9-internal"
OpenJDK Runtime Environment (fastdebug build 9-internal+0-adhoc.hk.openjdk)
OpenJDK 64-Bit Server VM (fastdebug build 9-internal+0-adhoc.hk.openjdk, mixed mode)

全文完,希望对有需要的朋友有所帮助。

总访问次数: 526次, 一般般帅 创建于 2019-12-10, 最后更新于 2020-06-25

进大厂! 欢迎关注微信公众号,第一时间掌握最新动态!