自分でJDKをコンパイルして、JVMへの関心を高めます。この記事では、OpenJDKのコンパイルプロセス、つまりコンパイル前の準備、コンパイル環境の構築、およびコンパイルについて説明する3つのパートに分かれており、これらの3つのパートでピットをまとめて説明します。
1.コンパイル前の準備
1.1 Linux環境をインストールする
OpenJDKのコンパイルでは、Windows環境はLinux環境よりも複雑なので、Linux環境をインストールすることを選択します。仮想マシンはWindowsに自分でインストールすることも、デュアルシステムを直接インストールすることもできます。ディスクはLinuxのインストール専用です。後者を選択し、最新バージョンのUbuntu 18.04.1LTSをインストールします。デュアルシステムを構築するプロセスはここでは繰り返されません。 、インターネット上には参考資料がたくさんあります。私のコンピューターはThinkPad-E480です。インストールが完了した後、ピットが大きいためにWIFIに接続できず、この問題を解決するために1泊し、リンクを添付して問題を解決しました。
https://askubuntu.com/questions/1070593/lenovo-thinkpad-e480-no-wifi-adaptor-found-in-ubuntu-18-04
1.2 OpenJDKソースコードをダウンロードする
当初の計画は周先生の本を段階的に追うことだったので、OpenJDK7をコンパイルする計画でした。OpenJDK7に対応するBootStrapJDKはOpenJDK6です。しかし、OpenJDK6がUbuntu 18.04.1 LTSでリソースを見つけるのは難しいので、このアイデアをあきらめて、 OpenJDK8をコンパイルします。BootStrapJDKはOpenJDK7です。実践により、この操作もずっとピットであることが証明されています。これについては後で説明します。
アイデアを決定したら、次のステップはOpenJDK8のソースコードをダウンロードすることです。2つの方法があります。
1つ目はMercurialです。長所は操作がとても簡単でファイルパッケージを解凍する必要がないことです。短所は時間がかかることです。実際、この方法を最終的に使用します。これには約30分かかると予想されます。 Mercurialはバージョン管理ツールでもあります。SVNやGitなどのツールを想像できます。コードをダウンロードするコマンドは次のとおりです。
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev
cd jdk8u-dev
sh get_source.sh
2つ目は手動による方法です。率直に言って、ソースコードパッケージを自分でダウンロードして解凍します。時間がかかるという利点がありますが、比較的言えば、リソースが見つからない場合は、古いバージョンのソースコードしかダウンロードできません。たとえば、私だけです。このリンクhttp://jdk.java.net/java-se-ri/8でソースコードを見つけてください。このバージョンは2015バージョンです。3年が経過しました。このようなコードは実際には後のコンパイルプロセスにあります。問題が発生した場合、それがLinuxの問題なのかOpenJDK8コードの問題なのかを判断できません。
これまでのところ、Linuxオペレーティングシステムがあり、コンパイルする必要のあるOpenJDKソースコードも利用できます。次のステップは、コンパイル環境を構築する方法を考えることです。
次に、コンパイル環境を構築します
何年も勉強した後、誰もが特定の学習方法を持っている必要があります。 ITにとって非常に重要な学習方法は、情報を取得した後、情報のデモまたはREADMEを読み取ることです。同様に、ReadME-builds.htmlと呼ばれるOpenJDKソースコードディレクトリにそのようなファイルがあります。
このファイルは基本的に私たちの記事の操作プロセスを実行します。最初に、はじめにを見てみましょう。
OpenJDK7の構築と比較して、Antは不要になり、ALT_ *の環境変数はサポートされなくなりました。OpenJDK7のコンパイルプロセスについては、周氏の本やインターネット上のその他の情報を参照してください。
ファイルの2番目の部分は、ソースコードをダウンロードすることです。コードのダウンロードリンクは、現在この記事の1.2に反映されているため、ここでは繰り返しません。
3番目の部分はビルドです。ここでは、各オペレーティングシステム環境でのソフトウェアとハードウェアの要件が示され、OpenJDK8のブートJDKは明らかにJDK7である必要があります。
2.1 ブートJDKをインストールします
ファイルの特定の開発者ビルド環境セクションでは、ブートJDKのインストール方法について実際に合意しました。コマンドは、次のとおりです(Ubuntu 18.04.1 LTSではaptitudeをapt-getに変更する必要があります)。
sudo aptitude build-dep openjdk-7
sudo aptitude install openjdk-7-jdk
実際の実行では、上記のコマンドも失敗し、インストールの候補がないことを示します。これは、この記事の1.2で説明した落とし穴の1つです。どのように解決しますか? https://askubuntu.com/questions/761127/how-do-i-install-openjdk-7-on-ubuntu-16-04-or-higherを参照してください。内部のppaメソッドの有効期限が切れており、押すことしかできません。 MDMowerで説明されているスキームに従って操作するために、手動インストールを選択し、最終的にブートJDKを正常にインストールしました。結果は次のとおりです。
linuxidc@linuxidc:~$ 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 依存関係チェック
実際、README-builds.htmlのプロセスに従うと、ブートJDKをインストールする前に依存関係チェックが実行されます。ブートJDKが最初にインストールされていない場合でも、bash ./configureを介して直接チェックすると、このステップの最初のプロンプトもインストールです。 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を完了した後、次のステップは、bash ./configureを再帰的に実行して、コンパイル環境のすべての依存関係がインストールされているかどうかを確認することです。この結果が表示されるまで:
====================================================
A new configuration has been successfully created in
/home/linuxidc/jdk8u-dev/build/linux-x86_64-normal-server-release
using default settings.
Configuration summary:
Tools summary:
Build performance summary:
補足説明は次のとおりです。依存関係チェックの再帰実行中に、libx11-devがプロンプトされる場合があります。Ubuntu18.04.1LTSは、次のようにインストールプロジェクトをプロンプトします。
sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
libX11-devのXは大文字であり、この依存関係が見つからないことを示すプロンプトが表示されます。このとき、大文字のXを小文字のx、libx11-devに変更する必要があり、依存関係を見つけることができます。
このステップで、OpenJDK 8のコンパイル環境の準備が整い、次のステップはOpenJDK8をコンパイルすることです。
三、コンパイル
コンパイルされたコードは非常に単純で、すべてを直接作成します。もちろん、README-builds.htmlに従って作成するパラメーターを使用してコンパイルすることもできます。手順は次のとおりです。
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 |
コンパイル前にいくつかの注意事項があります。これらの注意事項は、ファイルREADME-builds.htmlにも反映されています。
言語オプションを設定するには、最初にecho $ LANGを実行して出力を確認します。それがCでない場合は、export LANG = Cを実行します。
PATHを設定するには、最初にecho PATHを実行して出力を確認します。bootJDKがない場合は、exportPATH = "/ usr / lib / jvm / java-7-openjdk-amd64 / binを実行します。
JAVA_HOMEを確認するには、最初にecho $ JAVA_HOMEを実行し、出力を確認します。値がある場合は、JAVA_HOMEの設定を解除する必要があります。
これらの3段階のチェックに合格したら、makeコマンドを実行できます。すべてがうまくいけば、このコンパイル結果を見ることができます:
Finished building OpenJDK for target 'all'
このような結果が表示された場合は、コンパイルが成功したことを示しています。複数のディレクトリの下にあるbinディレクトリに移動して、。/ java-versionを実行して確認できます。
linuxidc@linuxidc:~/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-linuxidc_2018_09_23_16_59-b00)
OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)
linuxidc@linuxidc:~/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-linuxidc_2018_09_23_16_59-b00)
OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)
実際、私のコンパイルプロセスはスムーズではなく、2つの主な問題が発生しました。
1、 カーネルバージョンの問題をコンパイルする
この記事の1.2に記載されているソースコードを取得するには2つの方法があります。実際、最初は方法2を使用しました。ソースパッケージの/ hotspot / make / linux / Makefileファイルに記載されている2015openjdk-8u40をダウンロードしました。 SUPPORTED_OS_VERSIONは4.Xカーネルをサポートしていないため、以下のスクリーンショットに示すように、コンパイルレポートエラーが発生します。
Ubuntu 18.04.1 LTSのカーネルは4.15.0-34-genericであるため、コンパイルを続行する場合は、MakefileのSUPPORTED_OS_VERSION行の後に4%を追加する必要があります。
2、- Werror = deprecated-宣言の問題
問題1を解決してコンパイルを続けた後、後で多くの魔法の問題に遭遇し、問題を解決するための関連情報を見つけるのが困難でした。したがって、OpenJDK8が更新および開発され、Ubuntuも更新および開発されたと論理的に推論することしかできません。2つは同時に更新されます。最新のファイルを使用して問題をコンパイルする必要があります。さらに多くの情報が利用可能であると思います。 、しかし現在は2015年からopenjdk-8u40を使用しており、Ubuntuが最新であるため、問題が発生しても誰も修復しません(実際、アプリケーションシステムの多くは同じ理由で、長期間劣化しており、誰もこの機能を使用していません)問題がある場合、修正されない場合があります)。このとき、最新のOpenJDK8に切り替え、Mercurialから最新のコードをダウンロードし、Ubuntu 18.04.1LTSでコンパイルすることにしました。コンパイルプロセスで問題が発生し、エラーは次のように報告されました。
os_linux.inline.hpp:127:18: error: 'int readdir_r(DIR*, dirent*, dirent**)' is deprecated [-Werror=deprecated-declarations]
オンライン情報によると、glibc> = 2.24の場合、メソッドreaddir_rは非推奨であり、サポートされていないためです。getconfGNU_LIBC_VERSIONチェックにより、Ubuntu 18.04.1LTSバージョンがglibc2.27であることがわかり、多くの人がOpenJDKのバグを報告しています。リンクhttps://bugs.openjdk.java.net/browse/JDK-8179887、6/7/8/9はこの問題を修正するつもりはなく、このBUGは11で修正されるため、現在は他の方法でしか解決できません。 、解決策は次のとおりです。
./hotspot/make/linux/makefiles/gcc.makeファイルでWARNINGS_ARE_ERRORS = -Werroを見つけるか、この段落にコメントを付けるか、WARNINGS_ARE_ERRORS = -Wno-allに変更します。再度コンパイルすると、コンパイルが完了するまで警告は無視されます。
Recommended Posts