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

Die vorzeitige Kompilierung (AOT) in der Java-Welt ist seit langem ein Diskussionsthema, aber bis zum Aufkommen von GraalVM gab es kein Tool, das eine gute AOT-Kompilierung erreichen konnte, geschweige denn das gesamte Ökosystem antreiben konnte. Obwohl GraalVM das Native-Image-Tool bereitstellt, um Entwickler effektiv bei der AOT-Kompilierung zu unterstützen, ist das Erreichen einer sofort einsatzbereiten AOT-Kompilierung für Java-Anwendungen aufgrund der Komplexität und Vielfalt des Java-Ökosystems, insbesondere mit Reflektion- und Proxy-Technologien, immer noch eine große Herausforderung Wird häufig in verschiedenen gängigen Frameworks verwendet.

Spring Native-Projekt

Dank des Spring Native-Projekts des Spring Framework-Teams sind sie in der Lage, eine AOT-Kompilierung von Projekten mit einem Klick über Maven- oder Gradle-Plugins zu erreichen. Derzeit gilt es jedoch nur für Spring Boot-Projekte.

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

Hier sind die offiziellen Spring Native-Beispiele zum Generieren 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 Kompilierungszeit und einem großen Speicherverbrauch können wir ein AOT-kompiliertes Java-Programm im Zielverzeichnis erhalten. Dies ist eine eigenständige Binärdatei, die unabhängig und ohne Abhängigkeiten ausgeführt werden kann.

img

petclinic-jpa ist ein Programm, das von AOT kompiliert wurde und direkt ausgeführt werden kann

Extrahieren Sie Informationen zur Java-Klasse aus AOT-kompilierten Binärdateien

Der Schutz von Java-Code war in der Vergangenheit immer ein sehr schwieriges Problem, und AOT wird auch als Lösung für den Schutz von Java-Code angesehen. Leider können sich viele Java-Programme mittlerweile nicht mehr vom Framework trennen. Aufgrund der Komplexität des Frameworks müssen selbst von AOT kompilierte Programme Klasseninformationen in die endgültig generierte Binärdatei aufnehmen. Eigentlich sind die Klassendateien übersichtlich im Ressourcenbereich der Binärdatei 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>'

Extrahieren Sie am Beispiel von petclinic-jpa, das im vorherigen Schritt erhalten wurde, die Klasseninformationen daraus und vergleichen Sie sie mit dem Quellcode. Sie können sehen, dass Modellinformationen, Controller-Informationen und Serviceinformationen abgerufen werden können.

img