1. 程式人生 > >Ubuntu16.04編譯OpenJDK7u40

Ubuntu16.04編譯OpenJDK7u40

但是 jvm 一點 genealogy out list nic pda ren

下圖是OpenJDK6、OpenJDK7、OpenJDK7u和OpenJDK8這幾個項目之間的關系:

技術分享圖片

下面把編譯步驟記錄下來:

  • 編譯環境 Ubuntu 16.04.4 LTS
  • jdk版本 openjdk-7u40-fcs-src-b43-26_aug_2013.zip

1 Build Environments

1.1 編譯環境:Ubuntu 16.04

vagrant@ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS
Release:    16.04
Codename:   xenial

1.2 配置apt-get源

# http://wiki.ubuntu.org.cn/源列表
vi /etc/apt/sources.list

參考模板,把下面的內容寫入到/etc/apt/sources.list

deb http://mirrors.sohu.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ xenial-backports main restricted universe multiverse
##測試版源
deb http://mirrors.sohu.com/ubuntu/ xenial-proposed main restricted universe multiverse
# 源碼
deb-src http://mirrors.sohu.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ xenial-backports main restricted universe multiverse
##測試版源
deb-src http://mirrors.sohu.com/ubuntu/ xenial-proposed main restricted universe multiverse
# Canonical 合作夥伴和附加
deb http://archive.canonical.com/ubuntu/ xenial partner
deb http://extras.ubuntu.com/ubuntu/ xenial main

服務器列表

# 阿裏雲
http://cn.archive.ubuntu.com/ubuntu/
# 搜狐(山東聯通千兆接入)
http://mirrors.sohu.com/ubuntu/
# 中科大 LUG(合肥,電信/聯通/移動/教育網自動分流,同時也是 Deepin 官方)
https://mirrors.ustc.edu.cn/ubuntu/ (v4/v6) 
http://mirrors4.ustc.edu.cn/ubuntu/ (v4) 
http://mirrors6.ustc.edu.cn/ubuntu/ (v6)

1.3 安裝依賴項目

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-dev x11proto-print-dev binutils ant -y

# 安裝解壓工具,解壓源碼用到
sudo apt-get install unzip -y

1.4 單獨安裝jdk6

這裏安裝的oraclejdk-6

# Downloads and installs Oracle Java 6 from here:
# http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR
wget     --no-cookies     --no-check-certificate     --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie"     http://download.oracle.com/otn-pub/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin
chmod +x jdk-6u45-linux-x64.bin
./jdk-6u45-linux-x64.bin
sudo mv -T jdk1.6.0_45 /usr/lib/jvm/java-6-oracle-amd64
sudo chown -R root: /usr/lib/jvm/java-6-oracle-amd64

# 記住這個路徑(/usr/lib/jvm/java-6-oracle-amd64),後面會用到

2 Getting the Source

下載源碼,可以通過倉庫中獲取或直接下載官方打包好的源碼包

  • http://hg.openjdk.java.net/jdk7u/jdk7u4
  • https://download.java.net/openjdk/jdk7u6/promoted/b24/
# 創建一個目錄來存放下載的jdk源碼
mkdir /work/jvm && cd /work/jvm

# 下載
# wget http://www.java.net/download/openjdk/jdk7/promoted/b24/openjdk-7u6-fcs-src-b24-28_aug_2012.zip
wget https://download.java.net/openjdk/jdk7u40/promoted/b43/openjdk-7u40-fcs-src-b43-26_aug_2013.zip

驗證源碼包

md5sum openjdk-7u40-fcs-src-b43-26_aug_2013.zip
18dd8e96b2d7344635dd96fd280cc18b  openjdk-7u40-fcs-src-b43-26_aug_2013.zip

解壓源碼包

# 解壓,解壓後的目錄為openjdk
unzip openjdk-7u40-fcs-src-b43-26_aug_2013.zip

# 查看編譯文檔
openjdk/README-builds.html

3 Build

3.1 編譯前的準備

為避免編譯出錯,需要做的操作

# 通過修改CurrencyData.properties,把10年之前的時間修改為10年之內
vi jdk/src/share/classes/java/util/CurrencyData.properties
2006---2017
2005---2017
2004---2017

# 創建編譯輸出目錄
mkdir -p /work/jvm/jdkBuild/openjdk7u40/build

# 進入解壓後的源碼目錄/work/jvm/openjdk
cd /work/jvm/openjdk

3.2 設置環境變量並編譯

保存成腳本init.sh,執行腳本,待腳本成功執行完畢就編譯好了,當然中間會遇到各種小問題

export LANG=C
# Bootstrap JDK的安裝路徑
export ALT_BOOTDIR=/usr/lib/jvm/java-6-oracle-amd64
export ALT_JDK_IMPORT_PATH=/usr/lib/jvm/java-6-oracle-amd64

# 允許下載依賴
export ALLOW_DOWNLOADS=true

# 並行編譯的線程數,設置為和內核CPU一致
export HOTSPOT_BUILD_JOBS=8
export ALT_PARALLEL_COMPILE_JOBS=8

# 跳過"比較本次build出來的映像與先前版本的差異"
export SKIP_COMPARE_IMAGES=true

# 使用預編譯頭文件,加上編譯會快一點
export USE_PRECOMPILED_HEADER=true

# 要編譯的內容
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true

# 設置為false,避開javaws和瀏覽器Java插件之友的部分的build
export BUILD_DEPLOY=false

# 設置為false,就不會build出安裝包
export BUILD_INSTALL=false

# fix error
export DISABLE_HOTSPOT_OS_VERSION_CHECK=OK

# 編譯結果所存放的路徑
export ALT_OUTPUTDIR=/work/jvm/jdkBuild/openjdk7u40/build

# 去掉這兩個變量以避免不必要的錯誤
unset JAVA_HOME
unset CLASSPATH

# 檢查
make sanity

# 編譯
make 2>&1 | tee $ALT_OUTPUTDIR/build.log

執行編譯

sudo sh init.sh

3.3 遇到的問題

在編譯過程中遇到了各種問題,但大部分都通過“編譯前的準備”和”設置環境變量”這兩步步的配置來避免,但是下面這個錯誤雖然出現,但是通過再次編譯就沒有了。

編譯過程中出現如下錯誤(RMIConnectioinImpl_Stub.class Error),再次編譯

技術分享圖片

又出現如下錯誤(RMIServicerImpl_Stub.class Error),再次編譯就成功了。

技術分享圖片

3.4 可遇到的問題

下面是在初始編譯時遇到問題參考的別人總結的解決設計方法。

  • http://jaychang.iteye.com/blog/2397232
  • http://openjdk.5641.n7.nabble.com/problem-with-zip-dll-when-building-7u-td165683.html
  • http://www.mamicode.com/info-detail-1440652.html
  • http://chenjingbo.iteye.com/blog/1117021
  • http://cduym.iteye.com/blog/1892416
  • http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/raw-rev/a6eef545f1a2
  • http://stackoverflow.com/questions/12742128/build-openjdk7-on-ubuntu-12-04
  • https://bugs.launchpad.net/ubuntu/+source/openjdk-7/+bug/935346
  • http://www.centoscn.com/image-text/install/2015/0908/6140.html
  • http://blog.csdn.net/gobitan/article/details/24322561
  • http://softbeta.iteye.com/blog/1560047
  • http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7058133

3.5 編譯成功

編譯結束後,將輸出類似下面的日誌清單所示內容。如果之前已經全量編譯過,只修改了少量文件,增量編譯可以在數十秒內完成。

技術分享圖片

進入OpenJDK源碼下的build/j2sdk-image目錄,驗證一下:

技術分享圖片

4 Reference

  • Ubuntu安裝oracle-jdk-6

  • Ubuntu安裝openjdk-6

  • java project repository

  • OpenJDK wiki
  • Supported Build Platforms
  • Known OpenJDK Build Problems
  • The jdk7u-dev Archives
  • Build Infrastructure Group
  • The OpenJDK Developers‘ Guide

Ubuntu16.04編譯OpenJDK7u40