当前位置:首页 » 《随便一记》 » 正文

最新2023 win11+wsl2 自己编译自己的JDK

25 人参与  2023年04月02日 16:25  分类 : 《随便一记》  评论

点击全文阅读


最新2023 win11+wsl2 自己编译自己的JDK

参考文章,深入理解JAVA虚拟机 周志明的,结合网上多个实践文章终于完成。

1、安装ubuntu系统

参考我的上一篇文
win11安装wsl2的ubuntu
很简单的配置,系统是默认的ubuntu22.04

记得换个源,会很快,不过那个下文的gcc版本降级,需要稍微等一下。

2、下载jdk12源码并放到Linux系统

打包下载源码。

https://hg.openjdk.java.net/jdk/jdk12

下载zip

image-20230328223817154

下载完文件

有两个方案。

第一个直接解压到当前的下载目录中,然后使用cp命令,就是等很久没有进度条,很烦。不推荐

这是我当时的情景。 OTZ!!! cp或者mv 命令,卡住了

cp -r /mnt/e/download/googleDownload/jdk12-06222165c35f /home/jdk12/

/mnt/e 这个对于linux来讲的。/mnt 就能找到原来的真实windwos盘.e是 e盘,意思是windows下载解压放到了e盘的/download/googleDownload/

将jdk12-06222165c35f 这个解压的包,cp到 /home/jdk12/。

第二个就是,直接使用压缩工具,选择好文件夹,直接解压到,linux系统里面

关于如何找到linux的文件系统。 \wsl ,可以直接找到linux的存储地方。

直接用7zip 解压路径

\\wsl$\Ubuntu\home\shine\Project\jdk12\\wsl$\  找到系统按照路径Ubuntu  是安装的系统名称路径home 是系统里面,大家应该都知道,后面就是自定义了

有一说一,还是很慢!!!!!!!!!但是起码有进度条,让我知道有用
image-20230328235853137

3、下载openOracleJdk 11

然后要想编译jdk12,你需要搞一个编译jdk12的环境。

使用bash 命令

bootstrap jdk,引导环境。因为jdk12很多是java代码写的。

意思是,你需要下一个jdk11。

据原文说,大版本号为N,需要编译好的jdk必须是N-1的。

sudo apt-get install openjdk-11-jdk

4、配置好linux的编译环境

4.1、关键点,gcc的版本需要降低

ubuntu22.04的gcc是11太高了,后期生成源码配置会报错。需要使用gcc7

gedit 这个直接跳出文本编辑,比vim好用

\# ubuntu软件源配置文件gedit /etc/apt/sources.list# 向文件中添加如下代码,追加一个软件源deb [arch=amd64] http://archive.ubuntu.com/ubuntu focal main universe# 更新源文件apt-get update# 安装 gcc-7 g++-7apt-get -y install gcc-7 g++-7# 多版本管理 最后的数字越大,优先级越高 这里维护了7 9 11三个版本 默认是版本7update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50update-alternatives  --install /usr/bin/g++ g++ /usr/bin/g++-7 50update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 10update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 10update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 30update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 30

4.2、安装其他编译需要的配置

等的时候安装以下,第三方库,比如freetype,cups

sudo apt-get install build-essentialsudo apt-get install libfreetype6-devsudo  apt-get install libcups2-devsudo  apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-devsudo  apt-get install libasound2-devsudo  apt-get install libffi-devsudo  apt-get install autoconfsudo apt-get install libfontconfig1-dev

应该没啥问题了,那么开始真正的编译了。

5、进行编译

准备好环境,和依赖项目后,使用默认配置就可以开始编译了。

输出命令

bash configure --enable-debug --with-jvm-variants=server 编译,fastDebug版本,仅含Server模式的HotSpot虚拟机默认是 release版本 相关命令查询可以用   bash configure  --help

最后成功了 如下所示

====================================================A new configuration has been successfully created in/home/shine/project/jdk12/jdk12-06222165c35f/build/linux-x86_64-server-fastdebugusing configure arguments '--enable-debug --with-jvm-variants=server --disable-warnings-as-errors'.Configuration summary:* Debug level:    fastdebug* HS debug level: fastdebug* JVM variants:   server* JVM features:   server: 'aot cds cmsgc compiler1 compiler2 epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services shenandoahgc vm-structs zgc'* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64* Version string: 12-internal+0-adhoc.root.jdk12-06222165c35f (12-internal)Tools summary:* Boot JDK:       openjdk version "11.0.18" 2023-01-17 OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04) OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)  (at /usr/lib/jvm/java-11-openjdk-amd64)* Toolchain:      gcc (GNU Compiler Collection)* C Compiler:     Version 7.5.0 (at /usr/bin/gcc)* C++ Compiler:   Version 7.5.0 (at /usr/bin/g++)Build performance summary:* Cores to use:   15* Memory limit:   15900 MB

6、生成镜像

然后呢,生成镜像命令就是最后一步了。

make images

make 也会报错,会报错,参考8.2!!!因为源码问题

在这里插入图片描述
不知道有没有成功?太难了

7、验证编译结果

7.1、通过查看编译后JDK的版本,来验证编译是否成功

./build/linux-x86_64-server-fastdebug/jdk/bin/java --version

如果输出以下内容,则代表编译成功!

openjdk 12-internal 2019-03-19OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.gx.jdk)OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.gx.jdk, mixed mode)

这是本人的 不要直接输入java --version

#不要直接输入  java --version,这是个安装的jdk版本,不是编译的#root@Shine:/home/shine/project/jdk12/jdk12-06222165c35f/build/linux-x86_64-server-fastdebug/jdk/bin# java --versionopenjdk 11.0.18 2023-01-17OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing) root@Shine:/home/shine/project/jdk12/jdk12-06222165c35f/build/linux-x86_64-server-fastdebug/jdk/bin# ./java--versionopenjdk 12-internal 2019-03-19OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.root.jdk12-06222165c35f)OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.root.jdk12-06222165c35f, mixed mode)

8、问题总结

8.1、默认版本过高,make报错**

使用默认的gcc版本,然后bash configure,再make,导致以下问题,反正搞不定。

bash configure

WARNING: C and C++ compiler have different version numbers, gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. vs g++ (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE..

**解决方法,如上问4.1,降低版本

如果因为之前没弄,可以直接删除

rm -r -f 那个build的文件

8.2、jdk12源码问题

然后 make images 又报错

gedit  make/common/MakeBase.gmk

替换

# Does the actual work with parameters stripped.# If the file exists AND the contents is the same as the variable, do nothing# else print a new file.# Always returns the name of the file where the value was printed.# Param 1 - Name of variable# Param 2 - (optional) name of file to store value inDependOnVariableHelper = \    $(strip \        $(eval -include $(call DependOnVariableFileName, $1, $2)) \        $(if $(call equals, $(strip $($1)), $(strip $($1_old))),,\          $(call MakeDir, $(dir $(call DependOnVariableFileName, $1, $2))) \          $(if $(findstring $(LOG_LEVEL), trace), \              $(info NewVariable $1: >$(strip $($1))<) \              $(info OldVariable $1: >$(strip $($1_old))<)) \          $(call WriteFile, $1_old:=$(call DoubleDollar,$(call EscapeHash,$($1))), \              $(call DependOnVariableFileName, $1, $2))) \        $(call DependOnVariableFileName, $1, $2) \    )        

替换成下面的

# Does the actual work with parameters stripped.# If the file exists AND the contents is the same as the variable, do nothing# else print a new file.# Always returns the name of the file where the value was printed.# Param 1 - Name of variable# Param 2 - (optional) name of file to store value inDependOnVariableHelper = \    $(strip \        $(eval $1_filename := $(call DependOnVariableFileName, $1, $2)) \        $(if $(wildcard $($1_filename)), $(eval include $($1_filename))) \        $(if $(call equals, $(strip $($1)), $(strip $($1_old))),,\          $(call MakeDir, $(dir $($1_filename))) \          $(if $(findstring $(LOG_LEVEL), trace), \              $(info NewVariable $1: >$(strip $($1))<) \              $(info OldVariable $1: >$(strip $($1_old))<)) \          $(call WriteFile, $1_old:=$(call DoubleDollar,$(call EscapeHash,$($1))), \              $($1_filename))) \        $($1_filename) \    )

然后可以正常make images

参考博客

https://blog.csdn.net/qq_25825005/article/details/127162939


点击全文阅读


本文链接:http://zhangshiyu.com/post/58047.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1