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 プログラムをターゲット ディレクトリに取得できます。これは、依存関係なしで独立して実行できるスタンドアロン バイナリ ファイルです。

img

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を例として、そこからクラス情報を抽出し、ソースコードと比較します。機種情報、コントローラ情報、サービス情報が取得できていることがわかります。

img