日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Ubuntu >内容正文

Ubuntu

JVM-Ubuntu18.04.1下编译OpenJDK8

發(fā)布時(shí)間:2023/12/20 Ubuntu 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM-Ubuntu18.04.1下编译OpenJDK8 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  近期開(kāi)始學(xué)習(xí)JVM,看的是周老師的《深入理解Java虛擬機(jī)》,打算先自己編譯個(gè)JDK來(lái)提升對(duì)JVM的興趣。本文分三部分來(lái)描述編譯OpenJDK的過(guò)程,分別是編譯前準(zhǔn)備工作、構(gòu)建編譯環(huán)境、進(jìn)行編譯,在這三部分內(nèi)容中順帶把趟的坑一起說(shuō)明下。

、編譯前準(zhǔn)備工作

1.1 安裝Linux環(huán)

  編譯OpenJDKWindows環(huán)境要比Linux環(huán)境復(fù)雜,故選擇安裝Linux環(huán)境。可以自己在Windows下安裝虛擬機(jī),也可以直接安裝雙系統(tǒng),專門空出一個(gè)磁盤來(lái)安裝Linux,我選擇了后者,安裝最新版的Ubuntu 18.04.1 LTS,搭建雙系統(tǒng)的過(guò)程這里不再贅述,網(wǎng)絡(luò)上有非常多的材料可以參考。我的電腦是ThinkPad-E480,安裝完成后巨坑,無(wú)法連接WIFI,害得我花了一個(gè)晚上來(lái)解決這個(gè)問(wèn)題,附上解決問(wèn)題鏈接:

https://askubuntu.com/questions/1070593/lenovo-thinkpad-e480-no-wifi-adaptor-found-in-ubuntu-18-04

1.2 下載OpenJDK源碼

  原本是計(jì)劃按照周老師的書一步一步的操作,所以計(jì)劃的是編譯OpenJDK7OpenJDK7對(duì)應(yīng)的BootStrapJDKOpenJDK6,無(wú)奈OpenJDK6Ubuntu 18.04.1 LTS上很難再找到資源,故放棄了這個(gè)思路,改成編譯OpenJDK8BootStrapJDKOpenJDK7,實(shí)踐證明這個(gè)操作也是一路的坑,后面環(huán)節(jié)再敘述。

  確定了思路后,接下來(lái)就是下載OpenJDK8的源代碼,有兩種方式:

  第一種就是Mercurial,優(yōu)點(diǎn)就是操作起來(lái)很簡(jiǎn)單,不需要再解壓文件包,缺點(diǎn)就是需要耗費(fèi)的時(shí)間長(zhǎng)一些,實(shí)際上本人最終就是使用的這種方式,預(yù)計(jì)耗時(shí)半小時(shí)左右。Mercurial也是一種版本管理工具,大家可以想象下SVNGit之類的工具。下載代碼的命令如下:

?

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev cd jdk8u-dev sh get_source.sh

?第二種就是手動(dòng)方式,說(shuō)白了就是自己去下載源碼包,然后解壓,優(yōu)點(diǎn)就是耗時(shí)短,但相對(duì)來(lái)說(shuō)如果不會(huì)查找資源,就只能下載到老版本的源代碼,比如我就只找到這個(gè)鏈接http://jdk.java.net/java-se-ri/8下的源代碼,這個(gè)版本是2015年的版本,距離現(xiàn)在已經(jīng)過(guò)去了三年,這樣的代碼其實(shí)在后面的編譯過(guò)程中如果遇到一些問(wèn)題就無(wú)法判斷是Linux的問(wèn)題還是OpenJDK8的代碼問(wèn)題。

  到目前為止,已經(jīng)有了Linux操作系統(tǒng),需要編譯的OpenJDK源代碼也已經(jīng)有了,下一個(gè)環(huán)節(jié)便是思考如何構(gòu)建編譯環(huán)境。


二、構(gòu)建編譯環(huán)境

  學(xué)習(xí)了這么多年,大家應(yīng)該都具備了一定的學(xué)習(xí)方法。做IT的一個(gè)很重要的學(xué)習(xí)方法就是在拿到資料后,最好先翻閱下這個(gè)資料的DEMO或者是README之類的。同樣,OpenJDK源代碼目錄下也有這樣一個(gè)文件,叫做README-builds.html

  這個(gè)文件基本上貫穿了咱們本文的操作流程,首先來(lái)看下Introduction

  • The build is now a "configure && make" style build

  • Any GNU make 3.81 or newer should work

  • The build should scale, i.e. more processors should cause the build to be done in less wall-clock time

  • Nested or recursive make invocations have been significantly reduced, as has the total fork/exec or spawning of sub processes during the build

  • Windows MKS usage is no longer supported

  • Windows Visual Studio vsvars*.bat and vcvars*.bat files are run automatically

  • Ant is no longer used when building the OpenJDK

  • Use of ALT_* environment variables for configuring the build is no longer supported

  和OpenJDK7的構(gòu)建相比,已經(jīng)不再需要Ant,另外ALT_* 的環(huán)境變量也不再支持,OpenJDK7的編譯過(guò)程可查看周老師的書,也可以網(wǎng)上查閱其他資料。

  文件的第二部分內(nèi)容是下載源代碼,目前代碼下載環(huán)節(jié)已在本文1.2中體現(xiàn),這里不再贅述。

  第三部分就是Building,這里聲明了各個(gè)操作系統(tǒng)環(huán)境中的軟件硬件要求,明確要求了OpenJDK8boot JDKJDK 7

2.1 安裝boot JDK

  在文件中的Specific Developer Build Environments部分實(shí)際也約定了如何安裝boot JDK,命令如下(在Ubuntu 18.04.1 LTSaptitude 應(yīng)該改成apt-get):

?

sudo aptitude build-dep openjdk-7 sudo aptitude install openjdk-7-jdk

?實(shí)際執(zhí)行下來(lái),如上命令也是不成功的,提示沒(méi)有可安裝候選,這個(gè)也就是本文1.2提到的其中一個(gè)坑,該如何解決呢?請(qǐng)看https://askubuntu.com/questions/761127/how-do-i-install-openjdk-7-on-ubuntu-16-04-or-higher里面的ppa方式也已經(jīng)過(guò)期了,只能按MDMower描述的方案來(lái)操作,我這邊選擇了Manual Installation,最終成功安裝boot JDK,結(jié)果如下:

?

lingjiango@lingjiango-ThinkPad-E480:~$ java -version java version "1.7.0_161" OpenJDK Runtime Environment (IcedTea 2.6.12) (7u161-2.6.12-1) OpenJDK 64-Bit Server VM (build 24.161-b01, mixed mode)

?

2.2 依賴檢查

  實(shí)際上如果是按照README-builds.html的流程,在安裝boot JDK之前是先進(jìn)行依賴檢查的,即使沒(méi)有先安裝boot JDK,直接通過(guò)bash ./configure來(lái)檢查的話,這步最先提示的也是安裝boot JDK,提示如下:

configure: Could not find a valid Boot JDK. You might be able to fix this by running 'sudo apt-get install openjdk-7-jdk'. configure: This might be fixed by explicitely setting –with-boot-jdk

  在完成本文2.1后,接下來(lái)就是遞歸執(zhí)行bash ./configure來(lái)檢查編譯環(huán)境的依賴項(xiàng)是否全部安裝完成。直到看到這個(gè)結(jié)果:

?

==================================================== A new configuration has been successfully created in /home/lingjiango/jdk8u-dev/build/linux-x86_64-normal-server-release using default settings.Configuration summary: * Debug level: release * JDK variant: normal * JVM variants: server * OpenJDK target: OS: linux, CPU architecture: x86, address length: 64Tools summary: * Boot JDK: java version "1.7.0_161" OpenJDK Runtime Environment (IcedTea 2.6.12) (7u161-2.6.12-1) OpenJDK 64-Bit Server VM (build 24.161-b01, mixed mode) (at /usr/lib/jvm/java-7-openjdk-amd64) * Toolchain: gcc (GNU Compiler Collection) * C Compiler: Version 7.3.0 (at /usr/bin/gcc) * C++ Compiler: Version 7.3.0 (at /usr/bin/g++)Build performance summary: * Cores to use: 7 * Memory limit: 7872 MB

?

  這里再補(bǔ)充說(shuō)明下,在遞歸執(zhí)行依賴檢查的過(guò)程中可能會(huì)提示這個(gè) libx11-devUbuntu 18.04.1 LTS是這么提示安裝項(xiàng)目的:

sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev

  libX11-devX是大寫的,應(yīng)該會(huì)提示找不到這個(gè)依賴項(xiàng),這個(gè)時(shí)候要把大寫X改成小寫的x,為 libx11-dev,就可以找到依賴項(xiàng)了。
  到這一步,OpenJDK8的編譯環(huán)境就已經(jīng)準(zhǔn)備好了,下一步就是編譯OpenJDK8


三、進(jìn)行編譯

  編譯的代碼很簡(jiǎn)單,直接make all即可,當(dāng)然也可以按照README-builds.html中對(duì)make執(zhí)行帶參數(shù)編譯,說(shuō)明如下:



Make Target

Description

empty

build everything but no images

all

build everything including images

all-conf

build all configurations

images

create complete j2sdk and j2re images

install

install the generated images locally, typically in /usr/local

clean

remove all files generated by make, but not those generated by configure

dist-clean

remove all files generated by both and configure (basically killing the configuration)

help

give some help on using make, including some interesting make targets


  在編譯前還有幾個(gè)注意事項(xiàng),這些注意事項(xiàng)在文件README-builds.html中也是有體現(xiàn)的:

?

  設(shè)定語(yǔ)言選項(xiàng),可先執(zhí)行echo $LANG,看下輸出,如果不是C,則執(zhí)行export LANG=C

?

  設(shè)定PATH,可先執(zhí)行echo $PATH,看下輸出,如果沒(méi)有boot JDK,則執(zhí)行export PATH="/usr/lib/jvm/java-7-openjdk-amd64/bin:${PATH}"

?

  檢查JAVA_HOME ,可先執(zhí)行echo $JAVA_HOME,看下輸出,如果有值則需要unset JAVA_HOME

?

  這三步檢查執(zhí)行通過(guò)后,就可以執(zhí)行make命令了。一切順利的話,就可以看到這樣的編譯結(jié)果:

?

?

## Finished docs (build time 00:01:46)----- Build times ------- Start 2018-09-23 16:59:30 End 2018-09-23 17:08:39 00:00:19 corba 00:00:13 demos 00:01:46 docs 00:03:26 hotspot 00:00:18 images 00:00:13 jaxp 00:00:17 jaxws 00:02:01 jdk 00:00:25 langtools 00:00:11 nashorn 00:09:09 TOTAL ------------------------- Finished building OpenJDK for target 'all'

?

  看到這樣的結(jié)果,表示編譯成功,可以到多個(gè)目錄下的bin目錄執(zhí)行./java -version來(lái)驗(yàn)證。

lingjiango@lingjiango-ThinkPad-E480:~/jdk8u-dev/build/linux-x86_64-normal-server-release/jdk/bin$ ./java -version openjdk version "1.8.0-internal" OpenJDK Runtime Environment (build 1.8.0-internal-lingjiango_2018_09_23_16_59-b00) OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)lingjiango@lingjiango-ThinkPad-E480:~/jdk8u-dev/build/linux-x86_64-normal-server-release/images/j2sdk-image/bin$ ./java -version openjdk version "1.8.0-internal" OpenJDK Runtime Environment (build 1.8.0-internal-lingjiango_2018_09_23_16_59-b00) OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)

  事實(shí)上,我在編譯的過(guò)程中就不順利,主要遇到了兩個(gè)問(wèn)題:

1、編譯內(nèi)核版本問(wèn)題

?  在本文1.2中已經(jīng)提到了兩種獲取源碼的方式,其實(shí)一開(kāi)始我采用的是方法二,下載的是2015年的openjdk-8u40,這個(gè)源碼包中的/hotspot/make/linux/Makefile文件中聲明的SUPPORTED_OS_VERSION不支持4.X的內(nèi)核,所以編譯報(bào)如下截圖的錯(cuò)誤:

?

  因?yàn)?/span>Ubuntu 18.04.1 LTS的內(nèi)核是4.15.0-34-generic,故如果要繼續(xù)編譯下去,需要將MakefileSUPPORTED_OS_VERSION那行后面添加4%

2-Werror=deprecated-declarations問(wèn)題

?  在我把問(wèn)題1解決后,繼續(xù)編譯,后面又碰到了很多神奇的問(wèn)題,而且很難查找到相關(guān)解決問(wèn)題的資料。所以我只能從邏輯上推理下,OpenJDK8一直在更新發(fā)展,Ubuntu 也一直在更新發(fā)展,兩者同步更新,應(yīng)該取最新的文件編譯起來(lái)問(wèn)題才會(huì)少一些,而且猜測(cè)也有更多的資料可查,但是現(xiàn)在用的是2015年的openjdk-8u40,而 Ubuntu又是最新的,所以有問(wèn)題估計(jì)也沒(méi)有人去修復(fù)(其實(shí)我們的很多應(yīng)用系統(tǒng)一樣也是這個(gè)道理,年久失修,沒(méi)什么人用的功能有問(wèn)題也不一定去修復(fù))。這個(gè)時(shí)候我果斷切換到最新的OpenJDK8,通過(guò)Mercurial下載最新的代碼,然后在Ubuntu 18.04.1 LTS編譯。編譯的過(guò)程就碰到一個(gè)問(wèn)題,報(bào)錯(cuò)如下:

os_linux.inline.hpp:127:18: error: 'int readdir_r(DIR*, dirent*, dirent**)' is deprecated [-Werror=deprecated-declarations]

  查閱網(wǎng)上資料說(shuō)是這是因?yàn)?/span>glibc >= 2.24的情況下,方法 readdir_rdeprecated,不支持了,通過(guò)getconf GNU_LIBC_VERSION檢查發(fā)現(xiàn)Ubuntu 18.04.1 LTS版本為glibc 2.27,而且也有很多人在OpenJDK上報(bào)了BUG,鏈接https://bugs.openjdk.java.net/browse/JDK-8179887,6/7/8/9都不打算修復(fù)此問(wèn)題,會(huì)在11修復(fù)這個(gè)BUG,所以當(dāng)前只能通過(guò)其他的方式來(lái)解決,解決方案如下:

./hotspot/make/linux/makefiles/gcc.make文件中找到WARNINGS_ARE_ERRORS = -Werro,注釋該段或改成WARNINGS_ARE_ERRORS = -Wno-all。再編譯就會(huì)忽略掉警告,直到編譯完成。

?

?

?

?

?

參考資料:

?

《深入理解Java虛擬機(jī)》

?

README-builds.html

?


?

?

?

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/iou123lg/p/9696039.html

總結(jié)

以上是生活随笔為你收集整理的JVM-Ubuntu18.04.1下编译OpenJDK8的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。