JAVA虛擬機學習筆記(一)Windows10下編譯OpenJDK8


  轉載請注明源地址:http://www.cnblogs.com/lighten/p/5906359.html

1. 編譯環境的准備

  1.1 JDK源碼下載

    OpenJDK是JAVA發展史中的一個開源項目,本文以OpenJDK8為例進行編譯。OpenJDK的官網為:http://openjdk.java.net/,直接訪問http://openjdk.java.net/install/index.html進入主要界面。左側有一系列的,找到Source code列表,其提供了兩種形式的下載:Mercurial和Bundles(6)。

    Mercurial是一個代碼版本管理工具,和SVN、Git等相似,不過使用的人比較少而已。Bundles就是包的形式下載了,我們選擇這種方式。目前只提供了jdk6的鏈接頁面:http://download.java.net/openjdk/jdk6。要想下載到jdk8,將url改成jdk8就行了:http://download.java.net/openjdk/jdk8。進入頁面后,點擊下載就行了:

clip_image001

  2019/02/13更新:上述鏈接失效,補充: http://jdk.java.net/java-se-ri/8

  

  點擊紅色箭頭所指的鏈接進行下載,或者點擊:這里

  1.2 准備編譯環境

    解壓下載的壓縮包,進入文件夾,點擊README-builds.html,這是官方給的編譯指導手冊。閱讀第三節Building/System Setup/Windows篇。這里我就按照其上面說的繼續做了。

    在Windows下編譯需要一個Unix類似的環境,尤其是shell,可以通過使用CYGWIN或者是MinGW/MSYS來構建環境。這些模仿環境的工具不同之處主要在於它們對於路徑名稱的處理。這里以CYGWIN為例。

  1.2.1 CYGWIN安裝

    注意使用CYGWIN會導致一個忽略路徑的獨特問題。通常在Windows上的設置的路徑目錄通常用;分割,但是CYGWIN使用:來分割。這導致路徑如:C:\path不能被CYGWIN設置,除非使用/cygdrive/c/path這種CYGWIN能明白的路徑,但是這也只有CYGWIN能識別。

    OpenJDK需要1.7.16或更高版本的CYGWIN,去www.cygwin.com下載CYGWIN。說明一下:我下載的是2.6.0,提示我的版本太老了,當時心里…。為了不重來,最好還是下載1.7.16版本高一點的,但是看見1.7.17 windows10不支持,心里…。

    CYGWIN默認安裝的工具並沒有包含所有編譯所需的工具,所以不能選擇默認安裝,下圖為其額外所需要的工具:

image

    注意:CYGWIN軟件可能與你Windows上其它非CYGWIN的軟件沖突。可以去其官網的FAQ https://cygwin.com/faq.html看看有沒有解決方法,尤其要關注2.10的https://cygwin.com/faq/faq.html#faq.using.bloda (README-builds.html里面的鏈接失效了,我猜測應該是這兩個地址)。

   注意:這里還少了一個diffutils包。

    具體步驟如下:

    1.點擊下載下來的setup-x86_64.exe

    2.選擇第二個選項:download without installing,然后選擇下載的文件夾,遇到問題的時候網上搜了一下,發現有人推薦使用地址http://mirrors.kernel.org,我試驗了一下,確實還可以。那篇文章教導如果下到一半網絡不通失敗了怎么處理,這時要點擊關掉,關掉向導程序,然后按照之前的選擇,重來一遍,目錄和下載地址要一致,在選擇下載安裝包界面,如下圖,此時All后面是Default,斷線后應該為install,把其改成Reinstall,點擊下載。文章詳細地址如下:http://blog.chinaunix.net/uid-20178959-id-1731456.html。當然網上還有全安裝包下載的方法,我沒試過。最后讓其下載。

    3.下載完成后會下面這個界面,這個界面就需要選擇上圖所需的工具了:

image

    這里找上述的包可能比較難找,主要在Search中搜索上述的Package。如第一個ar.exe,如果搜索ar,是找不到這個工具的,但是搜索binutils,可以找到。但是實際上是沒有顯示哪個是我們需要的,因為沒有名稱是ar的,此時就要對比上述的描述Description了,這樣就確定了要下載哪個工具了,左擊Skip選中,出現版本號即可。通過Category可以快速定位,但是不准確,實踐中可行,但有些不對。總結一下就是以Package為主,Description為確定目標,這個畢竟是功能描述,包一致,功能也差不多,那就是那個包了,Category只能用於快速定位,沒找到要到其它Category中尋找。

    下載完成之后,就要開始安裝了,下面是安裝步驟:

    1.再次打開安裝向導,不過這次選擇第三個選項,從本地倉庫安裝

    2.選擇要安裝的目錄,再選擇剛剛文件下載的目錄

    3.到安裝包選擇界面,再選擇添加一次上述所需的包,點擊安裝,即可

    這樣如果包不對,應該可以重新下載包,然后再安裝包。

  1.2.2 Visual Studio 2010 Compliers安裝

    根據指導手冊,OpenJDK Windows構建需要VS2010專業版編譯器。編譯器以及其它工具的安裝位置希望由變量VS100COMNTOOLS定義,這個會由Microsoft Visual Studio installer自動設置。VS2010所需要的部分只有C++的部分而已。盡量安裝在默認安裝的位置,安裝完成后,重啟電腦,確保環境變量VS100COMNTOOLS已經設置了。確保TMP或TEMP也在你的Windows paths中設置了,例如:C:\temp。其它的路徑格式都不對,這有這一種正確。假設這個區域是用戶私有的,那么在默認安裝后,你應該會看到一個不同的用戶路徑在這些變量中。

    雖然只需要C++部分,但是單獨安裝編譯器比較麻煩,還是選擇Visual Studio C++ 2010 Professional或者Visual Studio C++ 2010 Express版本。這個網上到處都是,隨便下一個,用完之后就可以刪了。這里提供一個比較齊全的下載地址:http://www.itellyou.cn/。下載后只需要安裝C++的模塊就行了。Visual Studio C++ 2010 Express是沒有64位的版本的。推薦還是下載Professional版本。

  1.2.3 FreeType下載

    實際上這個包是我參考其它人的配置和書籍看到的,但是在官方的build文檔中並沒有提及這個問題。但是在給樣例參數的時候提到了Windows 32bit build with freetype specified:bash ./configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-bits=32,其還給了另一個樣例:Debug 64bit Build: bash ./configure --enable-debug --with-target-bits=64。如果你只使用bash ./configure配置,執行的時候會報需要freetype,所以還是加上這個吧。

    這是一個免費的字體渲染庫,OpenJDK的Swing部分和JConsole會使用到它。要去其官網上下載:http://www.freetype.org/。目前最新版本是2.7。直接下載地址:https://sourceforge.net/projects/freetype/files/latest/download?source=files 

2 編譯OpenJDK

    1.解壓下載的FreeType和OpenJDK8到同一個根目錄,目錄中最好不要有中文,以免帶來不好的影響。放在同一個路徑下也是為了等下在CYGWIN中好操作。

    2.通過CYGWIN進入OpenJDK8的解壓目錄。這里提一些基本的Linux知識。/路徑是根路徑,我們Windows上的C、D、E、F等盤都掛載在/cygdrive/路徑下。通過pwd查看當前路徑,一般進入的時候都是在/usr/home/xxx下面。直接通過cd /cygdrive/d/openjdk 更換盤符和其它路徑,就可以進入OpenJDK解壓的位置了。

    3.配置參數,並檢驗:bash ./configure 這種情況就是什么參數都沒有,還可以像上面說的加上--with-freetype=/cygdrive/c/freetype-i586 --with-target-bits=32,編譯成32位的JDK,或者是--enable-debug --with-target-bits=64具有調試功能的64位JDK。具體參數看README-builds.html中的Configure Options。回車,就會開始設置參數,並檢驗配置是否正確,如果有錯誤就看具體的錯誤信息了。我使用的是bash ./configure --with-freetype=/cygdrive/e/freetype-2.7 --with-target-bits=64

image

    4.配置成功之后,執行:make all進行編譯。如果失敗了執行make clean,清除編譯信息,但是不會清除之前的配置。make dist-clean就是全部清除了。Make命令詳細參數還是看README-builds.html中的Make模塊,編譯的時間比較漫長,我的筆記本比較渣,花了兩個小時,看來可以換一台了。

    5.編譯結束后,你就會在OpenJDK的根路徑下看見一個build文件夾,這個就是編譯的輸出路徑了。build/*/images/j2sdk-image/bin路徑必須包含配置了的OpenJDK工具的可執行文件。測試工具jtreg是有必要的。可以在http://openjdk.java.net/jtreg/網址中找到,提供了回歸測試,在倉庫(repositories)中運行命令:cd test && make PRODICT_HOME=`pwd`/../build/ 這個還沒有實驗過,一般只要在編譯輸出目錄中看見有java javac等命令就可以了。

3 編譯過程的錯誤

    1.configure: Could not find cmp!

      查了很久,最后在stackoverflow上找到了答案,還要裝一個diffutils包。還是使用那個引導客戶端,同樣的文件目錄,url。只把這個包下下來,再點擊進入引導客戶端。第三個選項,在安裝包界面的View 選擇Not Installed,就能看見這個包了。選擇安裝即可。

      這些包都可以在官網上找到:https://cygwin.com/packages/x86/diffutils/,至於怎么安裝就沒研究了,上面那個方法感覺挺方便的。

    2. Your cygwin is too old. You are running 2.6.0(0.304/5/3), but at least cygwin 1.7 is required. Please upgrade.

      看到這個提示,一陣無語。1.7.16是OpenJDK給的最低版本需求,而我又在搜索這個版本的時候在一個網站看見1.7.17版本,剛想下載時,發現其說明Windows10不支持,2016年1月之后的版本才開始支持Windows10的。回到官網,看見一條注意消息:2.5.2是最后一個支持Windows XP系統和Windows Server 2003的版本,想這個版本連Windows XP都支持,又離目前最新的2.6.0比較接近,應該能使用吧。官網上沒有找到舊版本的地址,在我不斷尋找舊版本的時候在官網上https://cygwin.com/faq.html#faq.what.version看見了4.23一段話,問題是有些應用是基於舊的版本的DLL安裝的,如果使用新的版本安裝會中斷。官方的解釋是,這要取決於中斷的含義了。如果應用的安裝需要的DLL在另一個位置而不是/bin目錄,看問題4.21。如果應用安裝是由於在/bin中舊版本的DLL,你就要大聲詢問應用提供者了。記住,Cygwin DLL嚴格兼容舊版本,新版本總會運行成功,所以一般而言你要保證你的版本是最新的。

     查看具體啟動步驟會發現,執行bash ./configure發現是運行了一個名為generated-configure.sh的腳本,其在OpenJDK中的common/autoconf目錄下。用Notepad++打開腳本,搜索Your cygwin is too old。發現在7211行開始檢查CYGWIN的版本信息,具體如下:

image

      將上面的7217-7225行注釋掉,不進行版本檢查即可。問題應該是出在7220行和7221行處,再執行一遍bash ./configure …。

    3.configure: error: Target CPU mismatch. We are building for x86_64 but CL is for ""; expected "x64".
      目前沒有什么好的方法解決,由於這只是檢查環境的設置,這個問題應該不大,CL.exe是被檢測到了,但是為什么版本識別不對就不清楚了。直接注釋掉判斷語句貌似沒有什么問題。如果誰知道是怎么回事,望告知。

    4.configure: Could not find /cygdrive/e/plugins/freetype-2.7/lib/freetype.dll. Ignoring location.
      這個就是freetype沒有編譯的問題了。使用Visual Studio C++ 2010對其編譯一下即可。具體步驟如下:

      1)用VS2010打開freetype/builds/windows/vc2010下的freetype.sln

      2)選中項目右擊,選擇屬性,出現配置框,點擊配置管理器,界面如下圖。

image

image

      3)右擊項目,選擇生成即可。在freetype目錄中/objs/vc2010/x64找到剛剛自己生成的freetype.dll文件。在freetype根目錄中創建一個lib文件夾,將這個文件放入其中。要32位的就是修改一下相應的配置就行了。除了dll,還要生成一個lib格式。網上看到其編譯64位時平台工具集要用的是WindowsXXSDK,32位用的是v100。但是實際上好像沒有什么問題,姑且先記錄一下。這里編譯的時候警告了編碼問題,但是當時沒有管,不知道后面產生的亂碼現象是不是這個問題。
    5.E:\plugins\openjdk\hotspot/make/windows/get_msc_ver.sh: 第 69 行:[: ▒▒▒▒ 80x86 ▒▒ Microsoft (R) 32 λ C/C++ ▒Ż▒▒▒▒▒▒▒ 16: 需要整數表達式。

      這里不清楚是什么原因造成的,編碼亂碼還是程序自身識別邏輯出錯?但是看程序源碼其本意是想測試cl.exe的版本,設定相應的值。cl.exe在vs2010安裝目錄下VC\bin\下有三個,在dos中運行一下看是哪個版本的。我的是16.00.30319.01版。然后修改openjdk\hostpot\make\windows\get_msc_ver.sh,65-73行注釋掉,直接添加MSC_VER=1600,上面有個說明。。cl version 12.00.8804 MSC_VER=1200。很不幸的是我沒看見16.00,最多到了15.00,就按這個規律改成了1600。

image

4.寫在最后

    實際上最后也不算完全編譯成功,編譯到nashorn的時候報了一個錯誤:Exception in thread "main" java.lang.VerifyError: class jdk.nashorn.internal.objects.ScriptFunctionImpl overrides final method setPrototype.這個我無法知道是什么問題,以目前的水平也不能像之前一樣排錯,這個class文件也是生成的,里面寫了些什么無法得知(也許和我用高版本的jdk8去編譯OpenJDK8有關系),折騰的也夠久了,第一次編譯JDK源碼,JDK的編譯算是成功了,算是向着虛擬機的學習邁出了第一步。或許等學習更深入之后,再一次編譯,可能不會這么磕磕盼盼。最后,如果有朋友知道這個問題產生的原因或者能講解一下為什么控制台編譯輸出亂碼是由於哪方面編碼導致的,那就非常感謝了。


免責聲明!

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



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