好奇心は猫を殺した
多くの小さなパートナーが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環境
コンパイルにJDK
はUnix
環境サポートが必要です!
これは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 8
とJDK 11
、それぞれを:
JDK 8をコンパイルする場合:
操作系统
:macOS 10.11.6boot JDK
:JDK 1.8.0(ビルド1.8.0_201-b09)Xcode版本
:8.2编译器
:バージョン8.0.0(/ usr / bin / clangにあります)
JDK 11をコンパイルする場合:
操作系统
:macOS 10.15.4boot JDK
:JDK 11.0.7(ビルド11.0.7 + 8-LTS)Xcode版本
:11.5编译器
:バージョン11.0.3(/ usr / bin / clangにあります)
コンパイルの過程で多くの問題が発生した場合は、ソフトウェアがインストールされていないか、ソフトウェアのバージョンが一致していない可能性が高くなります。簡単に諦めないでください。辛抱強くセルフチェックする必要があります。
JDKソースコードをダウンロードする
JDK
ソースコードをダウンロードするには、実際には2つの方法があります。
方法1:Mercurialツールを介してダウンロードする
Mercurial
Git
別の種類のコード管理ツールと同じように理解できます。インストール後、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 11
とJDK 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 8
とJDK 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
名前を付けるなど、最も基本的なプロジェクトを作成します。JdkTest
JDK
クリックして開きProject Structure
、SDKs
オプションを選択し、コンパイルしたばかりの新しくコンパイルされたJDKを追加し、それをプロジェクトのJDKとして選択して、正常に動作するかどうかを確認します。
[OK]をクリックした後、実行します。
自分でコンパイルしたJDKが使用されていることがわかります。
JDKソースコードを関連付けて変更する
JdkTest
プロジェクトの前のステップでProject Structure
→でダウンロードしたJDKソースコードパスにソースコードSDKs
をリンクし続けJDK
ます。
自分でダウンロードするのJDK源码
はとても簡単で、メモを取り、コメントを追加する際に、読み取り、デバッグ、変更を行い、ソースに無料で提供しました。
たとえば、最も単純な例ではSystem.out.println()
、この関数の基になるソースコードを開きます。
さりげなく変更して、次のような2つの単純なマークアップ行を追加しましょう。
新しい追加のコード行を有効にするには、JDKのルートディレクトリに再度移動する必要があります。ソースコードを再度実行して、make images
JDKを再コンパイルして有効にします。
以前は完全にコンパイルされているため、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、自己学習プログラミングルート、インタビュー質問コレクション/顔経、一連の技術記事などが含まれます。リソース継続的に更新されています...
小さいながらも毎日進歩する
遅い方が速い場合があります