Extraction des informations de classe Java à partir de fichiers binaires compilés par AOT

La compilation anticipée (AOT) dans le monde Java est un sujet de débat depuis longtemps, mais jusqu'à l'émergence de GraalVM, il n'existait aucun outil capable de réaliser une bonne compilation AOT, et encore moins de piloter l'ensemble de l'écosystème. Bien que GraalVM fournisse l'outil d'image natif pour aider efficacement les développeurs dans la compilation AOT, réaliser une compilation AOT prête à l'emploi pour les applications Java reste très difficile en raison de la complexité et de la diversité de l'écosystème Java, en particulier avec les technologies de réflexion et de proxy. largement utilisé dans divers cadres communs.

Projet Spring Native

Grâce au projet Spring Native de l'équipe Spring Framework, ils sont capables de réaliser une compilation AOT de projets en un clic via les plugins Maven ou Gradle. Cependant, il n’est actuellement applicable qu’aux projets Spring Boot.

Veuillez utiliser Sping Native pour générer des programmes Java compilés AOT

Voici les exemples officiels Spring Native pour générer des applications Java compilées AOT (environnement de test : 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

Après un temps de compilation relativement long et une consommation mémoire importante, nous pouvons obtenir un programme Java compilé en AOT dans le répertoire cible. Il s'agit d'un fichier binaire autonome qui peut s'exécuter indépendamment sans aucune dépendance.

img

petclinic-jpa est un programme compilé par AOT et peut être exécuté directement

Extraire les informations de classe Java à partir de fichiers binaires compilés AOT

La protection du code Java a toujours été un problème très difficile dans le passé, et AOT est également considéré comme une solution pour la protection du code Java. Malheureusement, de nombreux programmes Java ne peuvent désormais pas se séparer du framework. En raison de la complexité du framework, même les programmes compilés par AOT doivent inclure des informations de classe dans le fichier binaire final généré. Les fichiers de classe sont en fait soigneusement organisés dans la zone de ressources du fichier binaire.

Les outils suivants peuvent analyser et extraire des informations de classe à partir de fichiers binaires compilés en AOT

Les outils suivants peuvent analyser et extraire des informations de classe à partir de fichiers binaires compilés en 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>'

En utilisant petclinic-jpa, obtenu à l'étape précédente, à titre d'exemple, extrayez-en les informations de classe et comparez-les avec le code source. Vous pouvez voir que les informations sur le modèle, les informations sur le contrôleur et les informations sur le service peuvent toutes être obtenues.

img