AOTでコンパイルされたバイナリファイルからJavaクラス情報を抽出する

Javaにおける事前コンパイル(AOT)は長い間議論されてきたテーマですが、GraalVMが登場するまで、良好なAOTコンパイルを実現できるツールはなく、エコシステム全体を牽引することもありませんでした。GraalVMがnative-imageツールを提供して開発者のAOTコンパイルを効果的に支援しているにもかかわらず、Javaエコシステムの複雑さと多様性、特にリフレクションとプロキシ技術が様々な一般的なフレームワークで広く使用されていることから、Javaアプリケーションのすぐに使えるAOTコンパイルを実現することは依然として非常に困難です。

Spring Nativeプロジェクト

Spring FrameworkチームのSpring Nativeプロジェクトにより、MavenまたはGradleプラグインを通じてプロジェクトのワンクリックAOTコンパイルを実現できます。ただし、現在はSpring Bootプロジェクトにのみ適用可能です。

Spring Nativeを使用してAOTコンパイルされたJavaプログラムを生成してください。

以下は、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

比較的長いコンパイル時間と大量のメモリ消費の後、targetディレクトリに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