安装流程
下载OpenJDK12的源码
有两种方法:
- 访问官网: https://hg.openjdk.java.net/jdk/jdk12
点左边栏的zip 即可启动下载: 但这种方式慢得令人发指,建议还是用第二种方法。 - 访问Github主页:https://github.com/openjdk/jdk/tree/master
点master 分支,点tags ,往下拖,选中JDK12最新版,最后点Code , DownloadZip 即可。 通过这个方法下载OpenJDK源码最快。
将源码传输到Ubuntu系统里面
我用的是WinSCP,非常好用。 注意Ubuntu20我们装的一般是Desktop桌面版,默认是没有启动SSH服务, 可以通过下面命令安装:
sudo apt-get install openssh-server
安装好后新建一个文件夹,譬如叫jdk12 。由于Ubuntu的安全设置问题(账号权限问题),WinSCP还不能传输文件到这个文件夹,需要将文件夹的用户和用户组更改到当前用户(新建文件夹的默认用户和用户组是root,由于Ubuntu独特的设计,你没办法用root账号登陆WinSCP)。
chown james:james /jdk12
现在可以用WinSCP传输文件到jdk12 这个文件夹了。
解压文件
cd /jdk12
unzip jdk-jdk-12-33.zip
mv jdk-jdk-12-33 jdk12-33
cd jdk12-33
安装依赖
至少要用到以下依赖:
gcc -v
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 clean 和make dist-clean 来清理目录,才能确保新的配置生效。
make clean
make dist-clean
两个都要执行,再重新configure。
|