Ubuntu-20.04 编译OpenJDK12记录

安装流程

下载OpenJDK12的源码

有两种方法:

  1. 访问官网: https://hg.openjdk.java.net/jdk/jdk12
    点左边栏的zip即可启动下载:
    Ubuntu-20.04 编译OpenJDK12记录_第1张图片
    但这种方式慢得令人发指,建议还是用第二种方法。
  2. 访问Github主页:https://github.com/openjdk/jdk/tree/master
    master分支,点tags,往下拖,选中JDK12最新版,最后点Code, DownloadZip即可。
    Ubuntu-20.04 编译OpenJDK12记录_第2张图片
    Ubuntu-20.04 编译OpenJDK12记录_第3张图片
    Ubuntu-20.04 编译OpenJDK12记录_第4张图片
    通过这个方法下载OpenJDK源码最快。

将源码传输到Ubuntu系统里面

我用的是WinSCP,非常好用。
注意Ubuntu20我们装的一般是Desktop桌面版,默认是没有启动SSH服务, 可以通过下面命令安装:

sudo apt-get install openssh-server

安装好后新建一个文件夹,譬如叫jdk12。由于Ubuntu的安全设置问题(账号权限问题),WinSCP还不能传输文件到这个文件夹,需要将文件夹的用户和用户组更改到当前用户(新建文件夹的默认用户和用户组是root,由于Ubuntu独特的设计,你没办法用root账号登陆WinSCP)。

chown james:james /jdk12 #james为我的账号名, /jdk12为新建的文件夹

Ubuntu-20.04 编译OpenJDK12记录_第5张图片
现在可以用WinSCP传输文件到jdk12这个文件夹了。

解压文件

cd /jdk12
unzip jdk-jdk-12-33.zip #解压你通过Github下载的压缩文件
mv jdk-jdk-12-33 jdk12-33 #把解压后的文件夹改下名字, 当然不改也没问题
cd jdk12-33 # 进入该文件夹

安装依赖

至少要用到以下依赖:

gcc -v #查看有没有安装gcc
# 没有的话就用命令 sudo apt-get install build-essential 安装
# 下面依赖都会用到,提前安装好
sudo apt-get install autoconf
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
sudo apt-get install libcups2-dev    
sudo apt-get install libfreetype6-dev
sudo apt-get install libasound2-dev  
sudo apt-get install libffi-dev
sudo apt-get install libfontconfig1-dev

安装前置JDK

这个意思是,如果你要编译版本号为N的JDK,那你的Linux系统必需已经安装有较大版本号,或者至少N-1版本号的OpenJDK。譬如要编译JDK12,那你的电脑必须已经至少安装了JDK11。官方称之为Bootstrap JDK。
在Ubuntu中安装OpenJDK11非常简单,只需一个命令:

sudo apt-get install openjdk-11-jdk
java --version #安装完后查看版本号确认

开始编译

进入解压后的源码目录, 输入

bash configure

安静等待依赖检查,期间如果提示缺少依赖,按照要求安装相关依赖即可。
configure后面可以带参数,譬如:
bash configure --enable-debug --with-jvm-variants=server。笔者是取巧,直接使用默认的。
依赖检查通过后输入make all执行整个JDK的编译。如果你用不同参数Configure了几次,那需要带参数CONF来指定用哪一次的。

make all CONF=linux-x86_64-server-fastdebug

编译时遇到的一个关于C文件的错误

我第一次编译时老是遇到一个关于C语言文件的错误,百思不得其解:

=== Output from failing command(s) repeated here ===
......
In function ‘char* strncpy(char*, const char*, size_t)’,
    inlined from ‘static jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs*, bool*, JVMFlag::Flags)’ at 
    ...
    ...  ‘char* __builtin_strncpy(char*, const char*, long unsigned int)’ output truncated before terminating nul copying as many bytes from a string as its length [-Werror=stringop-truncation]
  106 |   return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
   ... (rest of output omitted)

我测试了几个版本的JDK都是同样问题,最后才知道原来问题出在我用的gcc版本上。
GCC在8.0之后的版本加入了stringop truncation的验证警告,这里是因为出现了警告导致编译不通过,那就禁止掉警告再进行编译。
查看我的gcc版本:

gcc -v
...
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

果然如此。禁用警告,从新编译:

bash configure --disable-warnings-as-errors --enable-debug
make all CONF=linux-x86_64-server-fastdebug

大概等了15分钟,成功!
进入/jdk12/jdk12-33/build/linux-x86_64-server-fastdebug/jdk/bin文件夹,输入:

./java --version

查看版本号,确认。
在这里插入图片描述

编译失败注意事项

如果编译失败,记得用命令make cleanmake dist-clean来清理目录,才能确保新的配置生效。

make clean
make dist-clean

两个都要执行,再重新configure。

你可能感兴趣的:(Java,Linux,linux,java)