長い間Javaを書いた後、JDKソースコードをコンパイルしましたか?ピットドキュメンタリーを踏むためのJDKソースコードのコンパイル

画像


好奇心は猫を殺した

多くの小さなパートナーがJava毎日開発とJavaコードの記述を行っていますJava基本的な環境がなければ、彼らは間違いなく実行できません。JDK結局のところ、私たちがJava記述しコードJVM仮想マシン上で実行されます。

一般的に言って、学ぶJava前に、最初のステップはJDK環境をインストールすることです。これは簡単で、通常JDKは公式Webサイトから直接ダウンロードします。インストールが完了すると、環境変数を使用して問題なく使用できます。

しかし、私たちが毎日使用しているものについては、これがソースコードからどのようにコンパイルされているのか興味がありませんか?

この元の質問で、今日は大きな仕事をし、かわいい小さな手を動かして、自分の手をコンパイルしますJDK

ちなみに、この記事オープンソースプロジェクトに含まていますhttps//github.com/hansonwang99/JavaCollection、自己学習プログラミングルート、インタビュー質問コレクション/対面、および一連の技術記事が含まれています、など。リソースは継続的に更新されています。


まだ埋められる穴があります

以前「JDKソースコード読み取り環境の構築」に関連するビデオと記事があったことを覚えています。気配りのある友人、あなたは非常に実用的な問題を見つけるかもしれません

私たちは、意志src.zipバッグJDK、このソースにリンクされているソースエキス、それらを、デバッグが進行しているが、我々は唯一の注釈付きの時にされている行の追加終わり、ラインは、元のコードの構造を変更しません。言い換えると、ソースコードに複数行の複数行コメントを追加すると、debugデバッグ時に現在の行がずれてしまい、少し恥ずかしいことです。

もちろん、ビデオのコメント領域には、この質問を提起した友人が実際に数人います:

画像

画像

画像

デバッグと実行を実際にサポートするコードは解凍したソースコードではないため、理由も非常に単純JDKです。これは関連付けにのみ使用されます。実際の操作はJDKシステムが以前にインストールされJDK環境で使用されます。

この問題を解決するために、独自の変更されたコード使用して独自のをコンパイル生成JDK、プロジェクトを使用して実行することしかできません。

だから、何か言うなら、肝臓は終わった!


環境への備え

最初に言うことは、コンパイル前のソフトウェアバージョン間の関係が非常に重要であるということです。ピットを踏んだとき、現れた奇妙な問題のほとんどすべてがこれに関連していました。バージョンが一致した後、それは非常にスムーズでした。

JDKをコンパイルするために必要な環境とツールを調べ整理ましょう

1、JDKを起動します

コンパイルする場合はJDK、最初に自分のマシンに事前JDKインストールしておく必要があります。これは正式に呼ばれますbootstrap JDK(または呼ばれますboot JDK)。

たとえば、コンパイルするJDK 8場合は、マシンに少なくとも1つJDK 7以上のバージョンが必要です。コンパイルするJDK 11場合は、マシンにJDK 10またはが装備されている必要があります11

だから、鶏は卵を産みます、卵は再び鶏を産みます...

2.Unix環境

コンパイルにJDKUnix環境サポートが必要です!

これはLinuxオペレーティングシステムとオペレーティングシステムのmacOS当然の保証ですが、Windows兄弟にとっては少し面倒であり、CygwinまたはMinGW/MSYSこの種のソフトウェアを使用してシミュレートする必要があります。

関係者が言ったように:LinuxプラットフォームでのコンパイルJDK一般的に問題が最も少なく、成功するのは簡単です;macOS第二に;Windows上記はもう少し努力を必要とし、より多くの問題があるかもしれません。

本質的な理由は、結局のところカーネルシステムWindowsはないということですUnix-Like。結局のところ、多くのソフトウェアの元のコンパイルは切り離せUnix Toolkitないので、比較的面倒なはずです。

3.コンパイラ/コンパイルツールチェーン

JDK基盤となるソースコード(特にJVM仮想マシン部分)の多くはC++/C記述されているため、関連するコンパイラーが暴走することはありません。

写真は千の言葉に値します。各プラットフォームでのコンパイラサポートを次の表に示します。プラットフォームに応じて選択できます。

4.その他のツール

典型的な例:

  • Autoconf:ソフトウェアソースコードパッケージの自動設定ツール
  • Make:ツールのコンパイルとビルド
  • freetype:無料のレンダリングライブラリ。JDKコードのグラフィック部分で使用できます。

[OK]を、それは環境インベントリーのためにそれだ次に、私が一覧表示されます。ソフトウェアの詳細なバージョン情報をコンパイルするときに私が使用していることJDK 8JDK 11、それぞれを:

JDK 8をコンパイルする場合:

  • 操作系统:macOS 10.11.6
  • boot JDK:JDK 1.8.0(ビルド1.8.0_201-b09)
  • Xcode版本:8.2
  • 编译器:バージョン8.0.0(/ usr / bin / clangにあります)

JDK 11をコンパイルする場合:

  • 操作系统:macOS 10.15.4
  • boot JDK:JDK 11.0.7(ビルド11.0.7 + 8-LTS)
  • Xcode版本:11.5
  • 编译器:バージョン11.0.3(/ usr / bin / clangにあります)

コンパイルの過程で多くの問題が発生した場合は、ソフトウェアがインストールされていないか、ソフトウェアのバージョンが一致していない可能性が高くなります。簡単に諦めないでください。辛抱強くセルフチェックする必要があります。


JDKソースコードをダウンロードする

JDKソースコードをダウンロードするには、実際には2つの方法があります。

方法1:Mercurialツールを介してダウンロードする

MercurialGit別の種類のコード管理ツールと同じように理解できます。インストール後、hg使用可能なコマンドがあります。

画像

OpenJDKソースコードは、事前にホスティングされていますhttp://hg.openjdk.java.net/

したがって、例えば、ダウンロードがJDK 8直接行うことができhg clone、そしてそれはgit clone同じ。

hg clone http://hg.openjdk.java.net/jdk8/jdk8

同様に、ダウンロードJDK 11

hg clone http://hg.openjdk.java.net/jdk/jdk11

しかし、この方法でのダウンロード速度はそれほど速くありません。

方法2:パッケージ化されたソースパッケージを直接ダウンロードする

ダウンロードリンク:https://jdk.java.net/

画像

ダウンロードするバージョンを選択します。


コンパイル前の自動構成

ソースコードパッケージをダウンロードしてローカルディレクトリに置き(不必要なトラブルを避けるためにパスは英語にすることをお勧めします)、解凍してからソースコードのルートディレクトリを入力して実行します。

sh configure

もちろん、デフォルトの構成アイテムはここで実行されています。

このステップでは、一連の自動構成作業が実行されます。通常、時間は非常に高速です。最後にプロンプ​​トが表示された場合は、幸い、コンパイル前の構成作業が完了します。

ここでは構成JDK 11JDK 8時間がそれぞれ完了しときに自分の外観を示します

完了するようにJDK8を構成します。

画像

完了するようにJDK11を構成します。

画像

注:この手順でエラーが発生した場合、特定のソフトウェア環境がインストールされていない可能性が高いか、インストールされていてもバージョンが一致しない場合は、通常、コンソールの印刷ログに通知されます。

たとえばJDK 8構成errof:GCC compiler is required問題が発生しました。

画像

明らかに、システムにはコンパイラがありますが、このエラーは引き続き報告されます。後で変更されたjdk源码根目录/common/autoconf/generated-configure.shファイルによって、構成によるコメントの後の関連する2行のコード

画像

画像

設定が完了したら、実際のコンパイルアクションが開始されます。


実際のコンパイルアクション

ここで行っているのは完全なコンパイルJDKです。ダウンロードしたソースコードのルートディレクトリで次のコマンドを実行するだけです。

make all

コンパイルのこのステップには少し時間がかかります。辛抱強く待ってください。コンパイルプロセスでエラーが発生した場合、コンパイルは終了します。次の2つの画面が表示されたら、おめでとうJDKございます。ソースコードのコンパイルに自分で合格し、お祝いのコーヒーを飲むことができます。 。

JDK8のコンパイルが完了しました。

画像

JDK11のコンパイルが完了しました。

画像

2つの写真を比較すると、コンパイルJDK 8JDK 11仕上げ時の出力にまだ違いがあることがわかります。時間の違いは主にJDK 11、コンパイラー構成がはるかに高いという事実によるものです。


検証結果

JDKソースコードがコンパイルされた後、多くの製品が確実に生成および出力されます。これは私たちが待ちきれないものです。

なぜならJDK 8およびJDK 11出力物事の内容や場所が異なっているので、ソースパッケージの組織構造は、同じではありません。一つずつ在庫を取りましょう。

1. JDK8コンパイル出力

コンパイルが完了すると、buildディレクトリがそのmacosx-x86_64-normal-server-releaseディレクトリの下に生成され、すべてのコンパイル結果がそのディレクトリに配置されます。

まず、コンパイルされたJava実行可能プログラムは、次のディレクトリにあります。

jdk源码根目录/build/macosx-x86_64-normal-server-release/jdk/bin

ディレクトリに入った後、次のこと./java -versionを確認するコマンドを入力できます

画像

第二に、コンパイルによって生成された完成品JDKパッケージはカタログにあります

jdk源码根目录/build/macosx-x86_64-normal-server-release/images

図に示すように、以下でそれを見つけてください。

画像

その中で:

  • j2sdk-image:生成されたJDKをコンパイルします
  • j2re-image:生成されたJREをコンパイルします

j2sdk-imageカタログを入力すると、内部JDKのコンテンツが、通常インターネットからダウンロードする完成品のコンテンツと一致していることがわかります

画像

2. JDK11コンパイル出力

JDK11のソースディレクトリ構成はJDK8のソースディレクトリ構成とは異なります。コンパイルによって生成された製品は、上記のJDK 8のコンパイルの出力とは多少異なりますが、それほど多くはありません。

JDK 11コンパイルが完了し、ディレクトリbuildそのmacosx-x86_64-normal-server-releaseディレクトリの下に生成され、すべてのコンパイル結果がその中に配置されます。

同じコンパイル済みJava実行可能プログラムをディレクトリに置くことができます

JDK源码根目录/build/macosx-x86_64-normal-server-release/jdk/bin

以下を参照してください。ディレクトリに入った後、./java -versionコマンドを入力して確認することもできます

画像

第二に、コンパイルによって生成された完成品JDK 11パッケージはカタログにあります

JDK源码根目录/build/macosx-x86_64-normal-server-release/images

図に示すように、以下でそれを見つけてください。

画像

jdkディレクトリには、最終製品であるJDK 11パッケージのコンパイルによって生成されます


独自にコンパイルしたJDKを使用する

JDK完成品を手作業で編集したので、wowを使用する必要があります。

コンパイルしたものを使用するためJava名前を付けるなど、最も基本的なプロジェクトを作成しますJdkTestJDK

画像

クリックして開きProject StructureSDKsオプションを選択し、コンパイルしたばかりの新しくコンパイルされたJDKを追加し、それをプロジェクトのJDKとして選択して、正常に動作するかどうかを確認します。

画像

画像

[OK]をクリックした後、実行します。

画像

自分でコンパイルしたJDKが使用されていることがわかります。


JDKソースコードを関連付けて変更する

JdkTestプロジェクトの前のステップでProject StructureダウンロードしたJDKソースコードパスにソースコードSDKsをリンクし続けJDKます。

画像

自分でダウンロードするのJDK源码とても簡単、メモ取り、コメント追加する際に読み取りデバッグ変更を行い、ソースに無料で提供しました

たとえば、最も単純な例ではSystem.out.println()、この関数の基になるソースコードを開きます。

画像

さりげなく変更して、次のような2つの単純なマークアップ行を追加しましょう。

画像

新しい追加のコード行を有効にするには、JDKのルートディレクトリに再度移動する必要があります。ソースコードを再度実行して、make imagesJDKを再コンパイルして有効にします。

画像

以前は完全にコンパイルされているため、makeインクリメンタルコンパイルは一般的に非常に高速です。

再コンパイル後、JdkTestプロジェクトを再度実行して、変更の効果を確認できます。

画像


複数行コメントの問題

「JDKソースコード読み取り環境」を構築するときに、問題が発生した可能性があることを覚えています。ソースコードの読み取りでは、ソースコードにコメントやメモを付けるのが非常に一般的です。ただし、コメントを作成するときにコードの行構造を変更できないという問題がありました(行をまたいでコメントすることはできません)。そうしないと、デバッグ中に行番号ずれてしまいます。

ソースコードディレクトリのマッピングを行ったにもかかわらず、実際のサポートはJDKプリインストールされたJDK環境であり、変更されたソースコードに基づいて再コンパイルおよび構築されていないため、理由は非常に単純です。これを解決するには、ここを参照してください。問題は非常に単純JDKです。上記のように自分でコンパイルするだけです。

実際の実験では、非常に典型的な問題もあります。中国語のコメントを複数行追加した後、予期せずコンパイルするとエラーが報告されるということです。

たとえば、上記の例の最も単純なSystem.out.println()ソースコードを例として、中国語のコメントを数行追加します。

画像

このとき、JDKソースディレクトリに移動してコンパイルすると、全画面が次のエラーに似ていることがわかります。

エラー:ASCIIのエンコードでマップできない文字

画像

結局、突然少し混乱して、コメントを数行追加しただけです。私たちにとって、ソースコードに複数行の中国語のコメントを書くことは基本的に必要ですが、コンパイルはエラーを報告します、これは楽しい遊びではありません...当時、背中は少し寒かったです。

正直なところ、私はこの問題をしばらく調査していて、遅くまで起きていました。結局、次のように投げて解決しました。ちなみに、友達と共有しました。この問題が発生した場合は、参考にして解決してください。

コンソールのエラーレポートから明らかなように、文字エンコードに関連する問題が原因である必要があり、それらはすべてasciiこのエンコード方法を示しています。

そこで、ルートディレクトリからVs CodeにJDKソースコードをインポートし、ディレクトリ全体でencoding ascii関連コンテンツを検索して、手がかりがあるかどうかを確認しました。

jdk源码根目录/make/common/SetupJavaCompilers.gmkファイルには、ascii関連するエンコード方法を指定する2つの場所があります

画像

したがって-encoding ascii、両方を次のよう置き換えてみてください-encoding utf-8

画像

その後、再度make imagesコンパイルを実行すると、コンパイルはスムーズに進みます。

画像

それでおしまい!

このように、後でソースコードを読んだりデバッグしたり、カスタマイズしたりするのJDK非常に便利です。

追記:この記事オープンソースプロジェクトにも含まれています:https//github.com/hansonwang99/JavaCollection、自己学習プログラミングルート、インタビュー質問コレクション/顔経、一連の技術記事などが含まれます。リソース継続的に更新されています...


小さいながらも毎日進歩する

遅い方が速い場合があります

おすすめ

転載: blog.csdn.net/wangshuaiwsws95/article/details/107375724