docker编译jdk8

为什么需要编译jdk?

  • 了解Java的核心技术,不仅仅停留在语言使用层面;

  • Jvm是由C++编写的,jdk里面很多库使用了native方法,具体实现也在jvm才能查看;

  • gdb调试Java代码,了解java代码的启动流程;

编译说明

笔者试过在ubuntu18.4以及centos7下面编译过jdk12,jdk8。当使用win下面的wsl下编译jdk会存在很多问题,但是使用centos编译jdk几乎没啥问题每次都很顺利(推荐使用centos7进行编译)。由于笔者已经在win下装好了docker,所以本次直接在docker里面使用centos7编译jdk,jdk则直接在容器里面通过git拉取openjdk源码(从gitee 中拉取,gitee从openjdk同步而来)

编译准备

dockerfile

dockerfile里面主要是获取centos7;安装编译jdk所需要的相关依赖以及jdk7;将相关的shell同步到容器,最后执行git_config.sh,拉取代码,开始编译

#基础镜像使用centos7
FROM centos:centos7

#定义工作目录
ENV WORK_PATH /usr/local

#定义解压缩后的文件名
ENV OPENJDK_SRC_DIR openjdk

#yum更新
RUN yum -y update

#安装工具集
RUN yum -y groupinstall "Development Tools"

#安装用到的软件依赖
RUN yum -y install unzip libXtst-devel libXt-devel libXrender-devel cups-devel freetype-devel alsa-lib-devel which git dos2unix java-1.7.0-openjdk-devel

#复制clone&make的shell
COPY  ./git_config.sh $WORK_PATH/$OPENJDK_SRC_DIR/
COPY  ./start_make.sh $WORK_PATH/$OPENJDK_SRC_DIR/

#如果是在win平台写的shell 在linux可能存在\n换行 需要转换
RUN dos2unix $WORK_PATH/$OPENJDK_SRC_DIR/start_make.sh
RUN dos2unix $WORK_PATH/$OPENJDK_SRC_DIR/git_config.sh

RUN chmod a+x $WORK_PATH/$OPENJDK_SRC_DIR/start_make.sh
RUN chmod a+x $WORK_PATH/$OPENJDK_SRC_DIR/git_config.sh

ENTRYPOINT ["/usr/local/openjdk/git_config.sh"]

获取jdk

使用git拉去源码,切到对应的标签(分支),该方式不仅可以编译jdk8,如需编译其他版本的jdk,只需dockerfile中安装对应版本需要的依赖,以及git相应的分支或标签

分支切好过后直接执行start_make.sh 进行编译, 也可以获取jdk源码后进入容器再手动执行

#!/bin/bash
cd $WORK_PATH/$OPENJDK_SRC_DIR

# 判断jdk是否clone下来
if [ ! -d "jdk" ];then
  git clone https://gitee.com/open-project-github/jdk.git
  cd jdk
  git checkout jdk8-b120
  mv ../start_make.sh ./
  # 编译jdk
  ./start_make.sh
else
  echo  "jdk is already"
fi

echo "************************************************************************"
echo ""
echo "start git"
echo ""
echo "************************************************************************"

echo "git clone end" > git.txt

# 避免shell执行完毕容器退出
tail -f /dev/null

编译配置

#!/bin/bash

chmod a+x ./configure

./configure --with-target-bits=64 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0

echo "************************************************************************"
echo "************************************************************************"
echo "************************************************************************"
echo ""
echo ""
echo "start make"
echo ""
echo ""
echo "************************************************************************"
echo "************************************************************************"
echo "************************************************************************"

make all CONF=linux-x86_64-normal-server-slowdebug ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK


echo "make end" > make.txt

# 下面是gdb需要的东西
#yum -y install yum-utils
#debuginfo-install -y glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64

开始编译

# 生成镜像
docker build -t jdk-build-git:v1 .

# 运行容器
docker run --privileged -itd --name jdk-build-git jdk-build-git:v1

# 查看容器信息
docker attach jdk-build-git

#容器中编译完毕后,进入容器
docker exec -it jdk-build-git /bin/bash

#查看jdk版本
cd /usr/local/openjdk/jdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/
./java -version

attach信息显示

configure执行成功后会显示以下信息

make执行时间较长,耐心等待。成功后会看到以下信息,此时可进入容器进行查看.如果安装完成过后,发现容器关闭了,只需docker start 容器id 后再进去即可

gdb

创建ThreadTest.java

本人比较习惯使用vim,没有依赖install一下就可以了

public class ThreadTest {
    public static void main(String[] args) {
        try {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName());
            }).start();
        } catch ( Exception e) {
            e.printStackTrace();
        }
    }

}

编译成class文件

./javac -g ThreadTest.java
./java ThreadTest

gdb调试

# gdb执行java
gdb ./java

# 设置gdb参数 也就是class文件
set args ThreadTest
# 设置断点
b java.c:187
# 运行
r
# 执行下一行
n
# 显示当前行
l
# 继续执行
c
# 退出
q

gdb相关调试参数详情可直接google

问题

如果gdb过程出现debuginfo-install XXXX,安装缺失的即可

yum-y install yum-utils
debuginfo-install -y XXXXXX

之所以b java.c:187 因为main方法入口在java.c文件中的187行

centos编译

如果直接使用centos7进行编译只需将dockerfile中的依赖直接在系统里面安装,然后拉取jdk源码,切到对应分支(标签),最后编译即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: docker-compose是一个用于定义和运行多容器Docker应用程序的工具。而JDK1.8是Java Development Kit (Java开发工具包)的缩写,是一款用于开发和执行Java应用程序的软件包。 在使用docker-compose部署应用程序时,如果应用程序需要运行在JDK1.8环境下,可以通过编写docker-compose.yml文件来实现。首先,在文件中定义一个服务,指定使用合适的基础镜像,例如openjdk:8。然后,可以在该服务的配置中指定所需的环境变量和卷挂载等配置项。 具体代码示例如下: ``` version: '3' services: myapp: image: openjdk:8 ports: - 8080:8080 volumes: - ./app:/app environment: - JAVA_OPTS=-Xmx512m ``` 在上述示例中,定义了一个名为myapp的服务,使用openjdk:8镜像。将宿主机的8080端口映射到容器的8080端口,将宿主机上的./app目录挂载到容器的/app目录,并设置了JAVA_OPTS环境变量。 通过运行docker-compose up命令,即可启动应用程序并运行在JDK1.8环境中。可以通过访问宿主机的8080端口,来访问应用程序。这样,就成功将应用程序和JDK1.8集成到了Docker容器中,实现了应用程序的便携性和环境隔离性。 ### 回答2: jdkJava Development Kit)是一款用于开发和运行Java应用程序的软件开发工具包。JDK 1.8是Java开发工具包的一个版本,它提供了许多功能和库,以支持Java应用程序的开发和执行。 Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它使用一个YAML文件来配置应用程序的服务,然后可以使用单个命令在多个Docker容器中运行整个应用程序。 在Docker Compose中使用JDK 1.8时,我们可以通过在Docker Compose配置文件中指定相应的镜像,来使用JDK 1.8作为Java应用程序的运行环境。例如,我们可以在配置文件中指定一个基于JDK 1.8的Java镜像,然后定义应用程序的服务,并在服务中指定镜像、传递需要的环境变量和卷等。 使用Docker Compose和JDK 1.8可以带来一些好处。首先,使用Docker可以将应用程序和其依赖项打包成一个独立的容器,使得应用程序在不同环境中的部署更加方便和可靠。其次,JDK 1.8提供了许多功能和性能优化,可以提高Java应用程序的执行效率和稳定性。 总结来说,使用Docker Compose和JDK 1.8可以将Java应用程序与其运行环境隔离开来,并提供了一种简单和可靠的方式来管理和运行多容器的应用程序。 ### 回答3: Docker-compose 是 Docker 官方提供的一个用于定义和运行多容器 Docker 应用程序的工具。而 JDK 1.8 是 Java Development Kit(Java开发工具包)的一个版本,它提供了 Java 编程语言的开发环境以及运行时的支持。 在使用 Docker-compose 来部署应用程序时,如果需要依赖 JDK 1.8 来运行应用程序,可以在 Docker-compose 文件中指定所需的镜像和相关设置。 首先,需要在 Docker-compose 文件的 services 部分定义应用程序服务的镜像。可以选择一个包含 JDK 1.8 的基础镜像,例如官方提供的 openjdk:8 镜像。在服务的定义中,可以指定 image 属性为 openjdk:8 或其他包含 JDK 1.8 的镜像。 接下来,可以在容器的启动命令或入口脚本中使用 JDK 1.8 所提供的 Java 运行命令来执行应用程序。例如,可以执行 java 命令来运行 Java 类,或执行 javac 命令来编译 Java 代码。 需要注意的是,JDK 1.8 可能会与部分应用程序存在兼容性问题,特别是在迁移旧的应用程序时。因此,在使用 Docker-compose 部署应用程序之前,需要确保应用程序与 JDK 1.8 的版本兼容,并进行适当的调试和测试。 总之,通过在 Docker-compose 文件中指定合适的镜像和相应的命令,可以在容器中运行使用 JDK 1.8 开发的应用程序。这种方式可以提供一个独立、可移植的环境,方便开发人员和运维人员快速部署和管理应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值