Java-Klasseninformationen aus AOT-kompilierten Binärdateien extrahieren

Die Ahead-of-Time-Kompilierung (AOT) in der Java-Welt ist seit langem ein viel diskutiertes Thema, aber bis zum Erscheinen von GraalVM gab es kein Tool, das eine gute AOT-Kompilierung erreichen konnte, geschweige denn das gesamte Ökosystem vorantreiben konnte. Obwohl GraalVM das native-image-Tool bereitstellt, um Entwicklern effektiv bei der AOT-Kompilierung zu helfen, ist es aufgrund der Komplexität und Vielfalt des Java-Ökosystems, insbesondere bei der weit verbreiteten Verwendung von Reflection und Proxy-Technologien in verschiedenen gängigen Frameworks, immer noch sehr schwierig, eine sofort einsatzfähige AOT-Kompilierung für Java-Anwendungen zu erreichen.

Spring Native Projekt

Dank des Spring Native-Projekts des Spring Framework-Teams können sie eine Ein-Klick-AOT-Kompilierung von Projekten über Maven- oder Gradle-Plugins erreichen. Derzeit 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 zur 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 einem hohen Speicherverbrauch können wir ein AOT-kompiliertes Java-Programm im Zielverzeichnis erhalten. Dies ist eine eigenständige Binärdatei, die unabhängig ohne Abhängigkeiten ausgeführt werden kann.

img

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

Java-Klasseninformationen aus AOT-kompilierten Binärdateien extrahieren

Der Schutz von Java-Code war in der Vergangenheit immer ein sehr schwieriges Problem, und AOT wird auch als Lösung für den Java-Code-Schutz angesehen. Leider können viele Java-Programme heutzutage nicht vom Framework getrennt werden. Aufgrund der Komplexität des Frameworks müssen selbst durch AOT kompilierte Programme Klasseninformationen in der endgültigen generierten Binärdatei enthalten. Die Klassendateien sind tatsächlich ordentlich im Ressourcenbereich der Binärdatei angeordnet.

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

Am Beispiel von petclinic-jpa, das im vorherigen Schritt erhalten wurde, werden die Klasseninformationen daraus extrahiert und mit dem Quellcode verglichen. Sie können sehen, dass Modellinformationen, Controller-Informationen und Service-Informationen alle erhalten werden können.

img