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

Javaの世界では、事前コンパイル(AOT)は長らく議論の的となってきましたが、GraalVMが登場するまでは、優れたAOTコンパイルを実現できるツールはおろか、エコシステム全体を駆動できるツールも存在しませんでした。GraalVMは開発者のAOTコンパイルを効果的に支援するネイティブイメージツールを提供していますが、Javaエコシステムの複雑さと多様性、特に様々な共通フレームワークで広く使用されているリフレクションやプロキシ技術のために、Javaアプリケーションですぐに使えるAOTコンパイルを実現することは依然として非常に困難です。

春の在来项目

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