最近开始拜读《深入理解Java虚拟机》第三版,希望自己可以对JVM虚拟机能得到一个整体的认识,以及让自己变得更厉害啦😁
我没有读过之前的两版,但感觉第一章就满精彩的,了解了Java的发展历史,也了解到了更多的jvm,很有意思。
在书中,作者建议读者自己尝试编译一下openjdk的源码,所以就有了这篇文章。
源码下载
hg.openjdk.java.net 这个地址中有所有版本的openjdk,我所想要编译的openjdk12在jdk
这个目录下面,具体地址是hg.openjdk.java.net/jdk/jdk12
可以选择两种方式,第一种使用hg
这个命令进行下载,类似于git
。第二种使用浏览器直接下载,点击左侧的zip
即可开始下载。如果下载速度过慢,或者是已经被墙了,可以尝试修改自己本地的dns地址,或者是使用代理软件。
这里推荐一下本人自用的v2ray机场吧:无界
编译
编译环境
我使用的是macOS 10.15.6,我本地默认开发使用的jdk版本是oracle jdk 1.8.0_251。
这个版本是不满足openjdk的构建标准的。按照作者所述,需要依赖于N-1个版本openjdk及以后版本,所以我得先安装openjdk 11才可以。
brew search openjdk
brew info openjdk@11
brew install openjdk@11
brew search openjdk
检索的时候,可以发现有两个,如果对第一个brew info
查看,可以得知是最新版本的,当下是openjdk14,不满足N-1,所以我选择安装openjdk@11(从作者的描述来看,我认为使用openjdk14应当也是可以编译openjdk12的,不过我没有实践)
我采用的是书中提到的默认参数
bash configure --enable-debug --with-jvm-variants=server
编译遇到的问题
问题1
configure: error: No xcodebuild tool and no system framework headers found, use --with-sysroot or --with-sdk-name to provide a path to a valid SDK
解决方案参考了https://segmentfault.com/a/1190000020736814
。
我首先尝试运行了一下xcodebuild
,得到了和上文作者一致的错误,但是我本地是没有安装xcode这个app的,因为我平时不会使用到xcode进行编程,所以我想尝试一下是否可以不安装xcode。
我在stackoverflow上找到了https://stackoverflow.com/questions/17980759/xcode-select-active-developer-directory-error
这个类似的问题,我有注意到这个回答:
我尝试了一下,是不可以的。于是我回到这个回答尝试去看一下这个回答下方的评论。
有看到评论说在新版本的macOS上已经无法脱离xcode了,所以最后还是把xcode给安装上了。
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
问题2
configure: Found potential Boot JDK using well-known locations (in /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk)
configure: Potential Boot JDK found at /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home is incorrect JDK version (java version "1.8.0_251"); ignoring
configure: (Your Boot JDK version must be one of: 11 12)
configure: Could not find a valid Boot JDK. You might be able to fix this by running 'brew cask install java'.
configure: This might be fixed by explicitly setting --with-boot-jdk
configure: error: Cannot continue
/Users/baofeidyz/workspace/openjdk/jdk12/build/.configure-support/generated-configure.sh: line 82: 5: Bad file descriptor
configure exiting with result code 1
按照提示,需要指定--with-boot-jdk
bash configure --enable-debug --with-jvm-variants=server --with-boot-jdk=/usr/local/opt/openjdk@11
问题3
/Users/baofeidyz/workspace/openjdk/jdk12/test/hotspot/gtest/classfile/test_symbolTable.cpp:62:6: error: explicitly assigning value of variable of type 'TempNewSymbol' to itself [-Werror,-Wself-assign-overloaded]
s1 = s1; // self assignment
~~ ^ ~~
1 error generated.
make[3]: *** [/Users/baofeidyz/workspace/openjdk/jdk12/build/macosx-x86_64-server-fastdebug/hotspot/variant-server/libjvm/gtest/objs/test_symbolTable.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [hotspot-server-libs] Error 2
没有c++基础,确实不知道这部分代码是在做什么,所以还是借助于Google尝试解决问题。
不得不说这版本的读者还是很多的,随手一搜就找到了相关的解决方案:xingmal.com/article/article/124851771263694..
根据此文的作者描述,我尝试将这个报错的代码注释掉了。
最后记得要先make clean
再make images
。
写到最后
其实问题3,我是比较好奇的,为什么会报错,虽然我用取巧的方案屏蔽掉了,但是不知道原因,就感觉给自己留了一个坑。不知道openjdk应该如何去提问?