編譯JDK12


編譯JDK12

前言

最近開始進行JVM的學習。在書中第一步便是編譯JDK,參考書是《深入理解Java虛擬機》,並且以后的環境也需要。

剛開始我在ParrotOS系統中編譯,出現挺多的問題,也不是什么大問題,一直因為卡的死死的而放棄。

本機只有8G內存想要全部利用,用虛擬機是不行的,於是便選擇了Ubuntu的WSL,很棒,配置好環境后一次編譯成功。選擇WSL的原因還有一個,就是Clion可以直接連接使用。

環境及建議

建議先瀏覽一下官方文檔的環境要求(我的虛擬機編譯不成功很可能和內存太小有關)

仔細查看Build-Hardware-Requirements

配置環境

安裝WSL

打開 Microsoft Store--> 搜索Ubuntu --> 安裝Ubuntu 18.04 LTS

安裝好后,建議更換為國內源,默認下載很慢

第一次使用WSL時可能需要使用管理員權限打開Powershell,運行下面的命令,然后重啟:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

配置&安裝環境依賴

基礎需要

  • make
  • zip
  • unzip

安裝CLang編譯器

sudo apt install build-essential

安裝OpenJDK編譯依賴庫

工具 庫名稱 實際
FreeType The FreeType Project libfreetype6-dev
CUPS Common UNIX Printing System libcups2-dev
X11 X Window System libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
ALSA Advanced Linux Sound Architecture libasound2-dev
libffi Portable Foreign Function Interface libffi-dev
Autoconf Extensible Package of M4 Macros autoconf

可能在過程中會出現缺少庫的問題,使用bash configure后會出現下面的例子,很人性化,根據句子中的提示安裝所需的庫即可

configure: error: Could not find alsa! You might be able to fix this by running 'sudo apt-get install libfontconfig1-dev'

安裝JDK

假設要編譯大版本號為N的JDK,我們需要安裝版本號為N-1的JDK,因為部分代碼是由C、C++編寫,大部分還是由Java語言實現。我們要編譯的是JDK12,所以需要JDK11來作“Bootstrap JDK”

sudo apt install openjdk-11-jdk

獲取源碼

hg clone http://hg.openjdk.java.net/jdk/jdk

下載很慢,建議在官網下載壓縮包到本地。往往壓縮包直接移動到WSL指定路徑中,在WSL中ls命令是不顯示的,應從/mnt/目錄下找到對應盤符,然后找到文件並復制文件到指定位置。例如:

cp /mnt/f/jdk12.tar.gz /home/h31i
tar -xzvf jdk12.tar.gz

檢查環境&配置

在目錄下使用bash configure命令

要想帶着調試、定制化的目的去編譯,就要了解OpenJDK提供了編譯參數,可以使用“bash configure --help”查看

cd jdk12
// 編譯FastDebug版、僅含Server模式的HotSpot虛擬機
bash configure --enable-debug --with-jvm-variants=server

缺少依賴就安裝。成功后會出現以下內容

A new configuration has been successfully created in
/home/h31i/jdk12/build/linux-x86_64-server-fastdebug
using configure arguments '--enable-debug --with-jvm-variants=server'.

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.h31i.jdk12 (12-internal)

Tools summary:
* Boot JDK:       openjdk version "11.0.5" 2019-10-15 OpenJDK Runtime Environment (build 11.0.5+10-post-Ubuntu-0ubuntu1.118.04) OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Ubuntu-0ubuntu1.118.04, mixed mode, sharing)  (at /usr/lib/jvm/java-11-openjdk-amd64)
* Toolchain:      gcc (GNU Compiler Collection)
* C Compiler:     Version 7.4.0 (at /usr/bin/gcc)
* C++ Compiler:   Version 7.4.0 (at /usr/bin/g++)

Build performance summary:
* Cores to use:   4
* Memory limit:   8083 MB

/build/文件夾下會生成目標文件

編譯&結果

執行make命令

make

然后,漫長的等待伴隨沙沙的風扇聲(預估30分鍾左右)。

編譯完成

Creating images/jmods/java.base.jmod
Creating support/demos/image/jfc/CodePointIM/CodePointIM.jar
Creating support/demos/image/jfc/FileChooserDemo/FileChooserDemo.jar
Creating support/demos/image/jfc/SwingSet2/SwingSet2.jar
Creating support/demos/image/jfc/Font2DTest/Font2DTest.jar
Creating support/demos/image/jfc/J2Ddemo/J2Ddemo.jar
Creating support/demos/image/jfc/Metalworks/Metalworks.jar
Creating support/demos/image/jfc/Notepad/Notepad.jar
Creating support/demos/image/jfc/Stylepad/Stylepad.jar
Creating support/demos/image/jfc/SampleTree/SampleTree.jar
Creating support/demos/image/jfc/TableExample/TableExample.jar
Creating support/demos/image/jfc/TransparentRuler/TransparentRuler.jar
Creating jdk image
Creating CDS archive for jdk image
Stopping sjavac server
Finished building target 'images' in configuration 'linux-x86_64-server-fastdebug'

測試

生成的JDK在/build/linux-x86_64-server-fastdebug/中,測試一下,如:

h31i@hostname:~/jdk12/build/linux-x86_64-server-fastdebug/jdk/bin$ ./java -version
openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.h31i.jdk12)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.h31i.jdk12, mixed mode)

錯誤

如果在編譯過程中出現問題,一句句代碼的錯誤,請在bash configure時加上--disable-warnings-as-errors參數

重新編譯時建議先make clean

強迫症(比如我)可以去/build/文件下刪除指定文件

下一步就是連接CLion了,再見

References:

CLion連接WSL


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM