在Java 9引入了所有主要更改之后,直到现在,我仍然停留在Oracle Java 8上。但是我发现,迁移到最新的OpenJDK甚至修补它以添加一些次要功能都是很有趣的。这意味着在本地构建和调试JDK。
因此,我首先在https://github.com/openjdk/jdk进入了OpenJDK的官方git镜像,并按照doc / building.html中的说明安装了如下所示的工具链:
使用git克隆JDK的master分支后,我打开Cygwin命令窗口并执行以下操作:
ln -s /cygdrive/f/<path to local openjdk repo> ./OpenJDK
cd OpenJDK
bash configure
我得到一个错误,显然是因为我的Windows git使用EOL = CrLf创建了源代码,而不是POSIX工具所期望的Lf。因此,我删除了克隆的存储库,并遵循doc / building.html的TL; DR部分,即在Cygwin命令窗口中,执行了以下操作:
hg clone http://hg.openjdk.java.net/jdk/jdk
cd jdk
bash configure
Configure无法从Visual Studio 2017中识别cl.exe,因为所有内容都是法语...因此我通过将UI语言从法语更改为英语来修改了VS2017的设置,并且configure一切正常。因此,我继续下一步:
make images
在这里,我遇到了有关本机代码链接的各种错误,而且我真的不知道如何解决它们……在网络上,只有一些博客介绍了如何构建OpenJDK 8,在边缘OpenJDK 14上却一无所获。我得到的错误摘录:
Compiling 1651 files for jdk.internal.vm.compiler
Compiling 108 files for jdk.aot
spaceDecorator.obj : error LNK2001: unresolved external symbol "public: class oopDesc * __cdecl ShenandoahBarrierSet::oop_load_from_native_barrier(class oopDesc *,unsigned int *)" (?oop_load_from_native_barrier@ShenandoahBarrierSet@@QEAAPEAVoopDesc@@PEAV2@PEAI@Z)
sparsePRT.obj : error LNK2001: unresolved external symbol "public: class oopDesc * __cdecl ShenandoahBarrierSet::oop_load_from_native_barrier(class oopDesc *,unsigned int *)" (?oop_load_from_native_barrier@ShenandoahBarrierSet@@QEAAPEAVoopDesc@@PEAV2@PEAI@Z)
tenuredGeneration.obj : error LNK2001: unresolved external symbol "public: class oopDesc * __cdecl ShenandoahBarrierSet::oop_load_from_native_barrier(class oopDesc *,unsigned int *)" (?oop_load_from_native_barrier@ShenandoahBarrierSet@@QEAAPEAVoopDesc@@PEAV2@PEAI@Z)
shenandoahRuntime.obj : error LNK2001: unresolved external symbol "public: class oopDesc * __cdecl ShenandoahBarrierSet::oop_load_from_native_barrier(class oopDesc *,unsigned int *)" (?oop_load_from_native_barrier@ShenandoahBarrierSet@@QEAAPEAVoopDesc@@PEAV2@PEAI@Z)
shenandoahTraversalGC.obj : error LNK2001: unresolved external symbol "public: class oopDesc * __cdecl ShenandoahBarrierSet::oop_load_from_native_barrier(class oopDesc *,unsigned int *)" (?oop_load_from_native_barrier@ShenandoahBarrierSet@@QEAAPEAVoopDesc@@PEAV2@PEAI@Z)
shenandoahVerifier.obj : error LNK2001: unresolved external symbol "public: class oopDesc * __cdecl ShenandoahBarrierSet::oop_load_from_native_barrier(class oopDesc *,unsigned int *)" (?oop_load_from_native_barrier@ShenandoahBarrierSet@@QEAAPEAVoopDesc@@PEAV2@PEAI@Z)
space.obj : error LNK2001: unresolved external symbol "public: class oopDesc * __cdecl ShenandoahBarrierSet::oop_load_from_native_barrier(class oopDesc *,unsigned int *)" (?oop_load_from_native_barrier@ShenandoahBarrierSet@@QEAAPEAVoopDesc@@PEAV2@PEAI@Z)
最近有人尝试过这种方法吗?找到了使它起作用的方法吗?