前面已经在macjvm-0x00-编译openjdk和linuxjvm-0x01-在Linux上编译openjdk22物理机上折腾过编译,之所以还在不厌其烦整编译,主要原因是我经常切换不同设备,很难保证环境工具的一致性,而且在物理机上编译确实可能对我现有的工具链产生侵入,所以这次又有docker上进行编译。想必这也是我最后一次做编译环境,后面就彻底统一了。
后面我尽量长期坚持更新源码笔记会在GIT仓库的jdk_22_study
分支上。
1 Dockerfile
不单单是编译jdk的必需依赖,还是我日常开发常用的工具环境,后面还有其他的我也会添加进来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| FROM --platform=linux/amd64 ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \ apt-get install -y --no-install-recommends \ build-essential \ nasm \ binutils \ dosfstools \ util-linux \ coreutils \ git \ wget \ openjdk-21-jdk autoconf libasound2-dev libcups2-dev libfontconfig1-dev libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev file zip unzip gawk \ && rm -rf /var/lib/apt/lists/*
ENV JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ENV PATH="$JAVA_HOME/bin:$PATH"
VOLUME /home/dev WORKDIR /home/dev
CMD ["/bin/bash"]
|
2 准备docker环境
2.1 制作镜像
1 2 3 4 5
| docker buildx build \ --build-arg http_proxy=http://host.docker.internal:7890 \ --build-arg https_proxy=http://host.docker.internal:7890 \ --build-arg all_proxy=socks5://host.docker.internal:7890 \ -t my-linux-dev ./docker --platform linux/amd64
|
2.2 启动容器
1 2 3 4 5 6 7 8 9
| docker run \ --ulimit nofile=65535:65535 \ --cap-add=SYS_PTRACE \ --security-opt seccomp=unconfined \ --rm -it \ --privileged \ --name my-linux-dev \ -v /etc/localtime:/etc/localtime:ro \ -v $PWD:/home/dev my-linux-dev
|
这里有个特别要注意的点就是参数--ulimit nofile=65535:65535
因为在jdk的工程太过庞大,在编译过程中需要打开很多的文件,所以这个参数一定要给够
3 编译
正式的编译过程就跟在物理机上一样了
1 2 3 4 5 6 7 8
| bash ./configure \ --with-debug-level=slowdebug \ --with-jvm-variants=server \ --with-freetype=bundled \ --with-boot-jdk=$JAVA_HOME \ --with-target-bits=64 \ --disable-warnings-as-errors \ --with-extra-cxxflags="-std=c++14"
|
3.2 make
1
| make CONF=linux-x86_64-server-slowdebug
|
3.3 运行java
1
| ./build/linux-x86_64-server-slowdebug/jdk/bin/java -version
|
最后,在mac+docker的方式不能调试,原因就是虚拟机里面跑虚拟机行不通