Estrazione delle informazioni sulla classe Java dai file binari compilati da AOT

La compilazione anticipata (AOT) nel mondo Java è stata argomento di dibattito per molto tempo, ma fino all'emergere di GraalVM non esisteva nessuno strumento in grado di ottenere una buona compilazione AOT, per non parlare di guidare l'intero ecosistema. Nonostante GraalVM fornisca lo strumento di immagine nativa per assistere efficacemente gli sviluppatori nella compilazione AOT, ottenere una compilazione AOT pronta per l'uso per le applicazioni Java è ancora molto impegnativo a causa della complessità e della diversità dell'ecosistema Java, in particolare con le tecnologie di riflessione e proxy ampiamente utilizzato in vari framework comuni.

Progetto Spring Native

Grazie al progetto Spring Native del team Spring Framework, sono in grado di ottenere la compilazione AOT di progetti con un clic tramite plug-in Maven o Gradle. Tuttavia, attualmente è applicabile solo ai progetti Spring Boot.

Si prega di utilizzare Sping Native per generare programmi Java compilati AOT

Ecco gli esempi Spring Native ufficiali per la generazione di applicazioni Java compilate AOT (ambiente di 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

Dopo un tempo di compilazione relativamente lungo e un grande consumo di memoria, possiamo ottenere un programma Java compilato AOT nella directory di destinazione. Questo è un file binario autonomo che può essere eseguito in modo indipendente senza dipendenze.

img

petclinic-jpa è un programma compilato da AOT e può essere eseguito direttamente

Estrai informazioni sulla classe Java dai file binari compilati AOT

La protezione del codice Java è sempre stata un problema molto difficile in passato e anche AOT è considerata una soluzione per la protezione del codice Java. Sfortunatamente, molti programmi Java ora non possono separarsi dal framework. A causa della complessità del framework, anche i programmi compilati da AOT devono includere informazioni sulla classe nel file binario generato finale. I file di classe sono effettivamente disposti in modo ordinato nell'area delle risorse del file binario.

Gli strumenti seguenti possono scansionare ed estrarre informazioni sulla classe dai file binari compilati AOT

Gli strumenti seguenti possono scansionare ed estrarre informazioni sulla classe dai file binari compilati 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>'

Utilizzando petclinic-jpa, ottenuto nel passaggio precedente, come esempio, estrai da esso le informazioni sulla classe e confrontale con il codice sorgente. Puoi vedere che è possibile ottenere informazioni sul modello, informazioni sul controller e informazioni sul servizio.

img