AOTでコンパイルされたバイナリファイルからJavaクラス情報を抽出する
Java の世界での AOT (Ahead-of-Time) コンパイルは長い間議論のテーマでしたが、GraalVM が登場するまでは、エコシステム全体を動かすことはおろか、優れた AOT コンパイルを実現できるツールもありませんでした。 GraalVM は、開発者による AOT コンパイルを効果的に支援するネイティブ イメージ ツールを提供していますが、Java エコシステム、特にリフレクションおよびプロキシ テクノロジの複雑さと多様性により、Java アプリケーションのすぐに使える AOT コンパイルを実現することは依然として非常に困難です。さまざまな共通フレームワークで広く使用されています。
Spring Native プロジェクト
Spring Framework チームによる Spring Native プロジェクトのおかげで、Maven または Gradle プラグインを介してプロジェクトのワンクリック AOT コンパイルを実現できます。ただし、現時点では Spring Boot プロジェクトにのみ適用されます。
AOTコンパイルされたJavaプログラムを生成するためにSping Nativeを使用してください
AOT コンパイル済み Java アプリケーションを生成するための公式 Spring Native サンプルは次のとおりです (テスト環境: Ubuntu 20.04、Docker 20.10.6)
git clone https://github.com/spring-projects-experimental/spring-native.git
cd spring-native/sample/petclinic-jpa
./build.sh
比較的長いコンパイル時間と大量のメモリ消費の後、AOT でコンパイルされた Java プログラムをターゲット ディレクトリに取得できます。これは、依存関係なしで独立して実行できるスタンドアロン バイナリ ファイルです。
petclinic-jpaはAOTでコンパイルされたプログラムであり、直接実行できます
AOTコンパイルされたバイナリファイルからJavaクラス情報を抽出する
Java コードの保護はこれまで常に非常に難しい問題であり、AOT は Java コード保護のソリューションとも考えられています。残念ながら、現在、多くの Java プログラムはフレームワークから分離できません。フレームワークは複雑であるため、AOT によってコンパイルされたプログラムであっても、最終的に生成されるバイナリ ファイルにクラス情報を含める必要があります。実際には、クラス ファイルはバイナリ ファイルのリソース領域にきちんと配置されています。
以下のツールは、AOTコンパイルされたバイナリファイルからクラス情報をスキャンして抽出することができます
以下のツールは、AOTコンパイルされたバイナリファイルからクラス情報をスキャンして抽出することができます
https://github.com/3-keys/binary-classfile-reader
git clone https://github.com/3-keys/binary-classfile-reader
cd binary-classfile-reader
./gradlew run --args='<path-of-the-binary-file> <output-folder>'
前の手順で取得したpetclinic-jpaを例として、そこからクラス情報を抽出し、ソースコードと比較します。機種情報、コントローラ情報、サービス情報が取得できていることがわかります。