Extrahieren von Java-Klasseninformationen aus Binärdateien, die von AOT kompiliert wurden

Die Ahead-of-Time-Kompilierung (AOT) in der Java-Welt ist seit Langem Gegenstand von Diskussionen. Bis zum Aufkommen von GraalVM gab es jedoch kein Tool, das eine zuverlässige AOT-Kompilierung ermöglichte, geschweige denn das gesamte Ökosystem steuern konnte. Obwohl GraalVM mit dem Native-Image-Tool Entwickler effektiv bei der AOT-Kompilierung unterstützt, bleibt die sofort einsatzbereite AOT-Kompilierung für Java-Anwendungen aufgrund der Komplexität und Vielfalt des Java-Ökosystems, insbesondere der in gängigen Frameworks weit verbreiteten Reflection- und Proxy-Technologien, eine große Herausforderung.

Spring Native 项目

Dank des Spring Native-Projekts des Spring Framework-Teams ist die Ein-Klick-AOT-Kompilierung von Projekten über Maven- oder Gradle-Plugins möglich. Aktuell ist dies jedoch nur für Spring Boot-Projekte anwendbar.

Bitte verwenden Sie Spring Native, um AOT-kompilierte Java-Programme zu generieren.

Hier sind die offiziellen Spring Native-Beispiele für die Generierung von AOT-kompilierten Java-Anwendungen (Testumgebung: 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

Nach einer relativ langen Kompilierzeit und hohem Speicherverbrauch erhalten wir im Zielverzeichnis ein AOT-kompiliertes Java-Programm. Es handelt sich dabei um eine eigenständige Binärdatei, die ohne Abhängigkeiten ausgeführt werden kann.

img

petclinic-jpa ist ein von AOT kompiliertes Programm und kann direkt ausgeführt werden.

Extrahieren von Java-Klasseninformationen aus AOT-kompilierten Binärdateien

Der Schutz von Java-Code war in der Vergangenheit stets ein schwieriges Problem, und AOT gilt als Lösungsansatz. Leider lassen sich viele Java-Programme heutzutage nicht mehr vom Framework trennen. Aufgrund der Komplexität des Frameworks müssen selbst mit AOT kompilierte Programme Klasseninformationen in die generierte Binärdatei einbinden. Die Klassendateien sind im Ressourcenbereich der Binärdatei übersichtlich angeordnet.

Die folgenden Tools können Klasseninformationen aus AOT-kompilierten Binärdateien scannen und extrahieren.

Die folgenden Tools können Klasseninformationen aus AOT-kompilierten Binärdateien scannen und extrahieren.

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>'

Nehmen wir beispielsweise petclinic-jpa, das wir im vorherigen Schritt erhalten haben, um die Klasseninformationen zu extrahieren und mit dem Quellcode zu vergleichen. Sie werden sehen, dass sich Modell-, Controller- und Serviceinformationen ermitteln lassen.

img