在Ubuntu 16.04上編譯OpenJDK8的原始碼
本文將詳細介紹在Ubuntu16.04上對OpenJDK8進行編譯。
1、準備編譯環境
使用的作業系統為Ubuntu16.04,如果讀者沒有安裝Ubuntu,可以在Windows上使用虛擬機器器的方式進行安裝,或者可以直接在電腦上安裝多系統,這種方式比以虛擬機器器安裝的方式速度要快。Ubuntu作業系統使用的是Linux核心,由於HotSpot是由C++編寫的,所以在編譯時需要Linux的編譯器GCC。
2、下載原始碼
OpenJDK使用的程式碼管理工具為Mercurial(hg),下載並安裝Mercurial後就可以通過hg clone命令獲取OpenJDK8的原始碼了,相關的命令如下:
hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdkcd openjdk
bash ./get_source.sh
使用Mercurial下載時速度相對較慢,可以直接去相關網站上下載壓縮包,網址為:http://download.java.net/openjdk/jdk8。筆者下載的壓縮包為openjdk-8-src-b132-03_mar_2014.zip,使用如下命令對壓縮包進行解壓:
unzip openjdk-8-src-b132-03_mar_2014.zip
解壓後openjdk目錄下重要的目錄如下表所示。
3、編譯原始碼
openjdk中的README-builds.html網頁提供了編譯原始碼的相關說明。在Ubuntu作業系統下編譯可以分為兩步:
第一步,生成編譯配置的指令碼
生成編譯配置的指令碼使用的命令如下:
bash ./configure \
--with-target-bits=64 \
--with-boot-jdk=/usr/java/jdk1.7.0_80/ \
--with-debug-level=slowdebug \
--enable-debug-symbols ZIP_DEBUGINFO_FILES=0
執行這個命令對編譯的openjdk所需要的依賴進行檢查,如果終止,可根據對應的提示安裝相關的依賴。命令列選項--with-target-bits指定編譯64位系統的JDK;命令列選項--with-boot-jdk指定引導JDK所在目錄,以防其他安裝的JDK影響。構建JDK8需要使用JDK7 Update 7或更高版本的版本作為引導JDK,但不應使用JDK8作為引導JDK;命令列選項--with-debug-level=slowdebug,有這個選項,可以在GDB等程式碼除錯過程中提供足夠的資訊;--enable-debug-symbols ZIP_DEBUGINFO_FILES=0生成除錯的符號資訊,並且不壓縮。
如果命令執行成功,會在當前目錄下生成一個目錄,目錄的名稱是根據要編譯的目標確定的,如筆者Ubuntu 64位作業系統下生成的目錄名為linux-x86_64-normal-server-slowdebug。
第二步,編譯
編譯使用的命令如下:
make all ZIP_DEBUGINFO_FILES=0
如果命令執行成功,則成功編譯出了JDK。執行如下命令:
./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version
輸出的資訊如下:
openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-mazhi_2019_08_12_20_52-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70-debug, mixed mode)
在openjdk下建立一個Test.java原始檔,內容如下:
public class Test{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
通過Javac編譯器編譯如上的原始碼,得到Test.class檔案。
執行如上的Class檔案,命令如下:
./build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac Test.java
./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test
輸出如下的資訊:
Hello World!