起因
最近,看synchronized的锁的底层原理,其中有一个涉及底层C++部分的objectMonitor对象,在进一步了解的过程中,以及之前看深入理解java虚拟机中第一部分,自己编译jdk的触发,开始考虑本地编译jdk,在jdk上进行调试的想法,遂开始网上找文档,我的环境是wsl(ubuntu)+clion.
心路历程
我一开始一直以为这个难点在于wsl的ubuntu毕竟不是原生的,依附于windows,这方面比较新,可能参考资料不多,查找教程也是往wsl编译jdk上靠,遂找到这两个方案,(219条消息) 《深入理解Java虚拟机:JVM高级特性与最佳实践(第三版)》中使用WSL进行JDK编译并在CLion中调试_cy948的博客-CSDN博客, (219条消息) Windows 10 + WSL(ubuntu 20.04) + CLion 编译JDK12_砖头23333的博客-CSDN博客,其实按部就班的按上面来,也未必有问题,不过哎,我就想编译jdk8版本的,没成想,这点坚持开始了后期的精神折磨.
遇到的问题:
jdk8的源码超级不好下,搜索下载jdk8源码,往往两个方案:
第一,官方下载源代码
这个一般通过openjdk官方,里面选择自己想要的版本,点进去是这样的:
这里有个巨坑,从官方下载的,有的是全部源码,相关jar都会下载下来,有的是类似maven版本控制那种,只有个类似pom.xml文件.
第二,直接下载成品:
一方面github上面也有github/openjdk,其实这个也是官方,不过版本标注模式比较迷,其实gitee也有一样的镜像gitee,这个也是,版本标注迷,还有最新更新只到2017年左右,我们知道实际上jdk8一直在维护的.这个版本不是最新的.
可惜我都试过了,这两种都不是太行,注意,是不太行,不是不行.考虑到我的能力,但就已知问题看,小问题太多太多,虽然大部分都有解决方案,但你在修改过程中,明显感受到版本问题很重,有些是修改源码,有些是删除源码.
最终我卡在了提示cc1plus: all warnings being treated as errors ,这个意思gcc把警告当作错误处理,解决方案有,但前提要gcc降版本,一方面./config -no-warnings-are-errors 这种方式,高版本gcc不生效,添加环境变量我也试了也是没效果,目前了解到可能要降到gcc4开头的版本可能有效果,将版本也是个痛苦的事情,问题还不一定有效果,4.9的我试了不行,目前手里有4.8.2的gcc,还没试,到这一步,基本就搞一天了,主要下jdk是真的恶心,格局小了,一开始出于谨慎,这种非官方来源的代码不是特别敢运行,沙箱啥的又觉得费劲,所以用第一种方案下的源代码,哎,巧了!刚好下的就是那种需要运行类似git的拉去源代码的形式,通过命令hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev/ 拉取源代码,我以为下下来的就是全部的源码,运行make images命令,死活编译过不去,其实下载的官方文档doc/building.md里面有步骤说明…,害,主要现在遇到问题,还停留在走一步看一步,不行上百度的层次,还没到高手那种系统的方法论,找官方,看源码.好在,以前自己搞事情的经验告诉我,还是要灵活,换个法,我就开始搜编译jdk8 ,侧重点不放在wsl上了,事实证明这是对的,!!!实战:自己编译JDK | 码农家园 (codenong.com),原本完全按照这个博主的做法做就行了.主要用hg命令下载是真的慢,我想着用github上下载好的,走博主这个模式不就行了…谁知又是坑,版本问题,版本问题,版本问题,重要的事情说三遍,还是会出现上文的问题.
这时我留个后手,昨天用hg下了一天的源码貌似下好了,hg命令下载的时候一定要选择适合自己的版本,这里我20.04的ubuntu,应用进项apt-get update之后,我从官网选择jdk8里面的jdk8u,也可以考虑jdk8u-dev,这两个我看基本上最后更新日期都很新.然后我按照博主的方法完美运行.clion部分参照最上面两个wsl文章即可。
总结:
基于版本考虑,能从官方下就从官方下目标jdk版本下最新版本的源代码(如果自己的操作系统本身比较新的话),下完看下readme文档,里面有要不要用hg命令再次拉取源代码.只要源码本身全且与系统契合,make编译时你会发现及其丝滑,我用官方jdk8最新源码加hg命令拉取源代码,最后make时,一次通过!!!
上图有一处与二者的不同,由于我选择的jdk8u的版本很新,个人推测应该是用再像之前那样,选择jdk7 的版本了,可以直接考虑用自己编译出的java命令.
心得体会:
版本问题依然是工程开发过程中的不可避免的棘手问题,记得我自己上手的第一个大一点的demo项目,作死,改了一个mavenJar包的版本,牵一发动全身,bug不断,自己构建项目整体,整体对于版本控制这方面,还是应该上心些.
|