Extracción de información de clase Java de archivos binarios compilados por AOT

La compilación anticipada (AOT) en el mundo Java ha sido tema de debate durante mucho tiempo. Sin embargo, hasta la aparición de GraalVM, no existía ninguna herramienta capaz de lograr una buena compilación AOT, y mucho menos de gestionar todo el ecosistema. A pesar de que GraalVM proporciona la herramienta de imagen nativa para ayudar eficazmente a los desarrolladores en la compilación AOT, lograr una compilación AOT lista para usar para aplicaciones Java sigue siendo un gran desafío debido a la complejidad y diversidad del ecosistema Java, especialmente con las tecnologías de reflexión y proxy ampliamente utilizadas en diversos frameworks comunes.

Nativo de primavera 项目

Gracias al proyecto Spring Native del equipo de Spring Framework, se puede compilar proyectos AOT con un solo clic mediante plugins de Maven o Gradle. Sin embargo, actualmente solo es aplicable a proyectos Spring Boot.

Utilice Sping Native para generar programas Java compilados con AOT

Aquí están los ejemplos oficiales de Spring Native para generar aplicaciones Java compiladas con AOT (entorno de prueba: 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

Tras un tiempo de compilación relativamente largo y un alto consumo de memoria, podemos obtener un programa Java compilado con AOT en el directorio de destino. Este es un archivo binario independiente que puede ejecutarse de forma independiente sin dependencias.

img

petclinic-jpa es un programa compilado por AOT y puede ejecutarse directamente

Extraer información de clase Java de archivos binarios compilados por AOT

La protección del código Java siempre ha sido un problema muy complejo en el pasado, y AOT también se considera una solución. Desafortunadamente, muchos programas Java ahora no pueden separarse del framework. Debido a la complejidad del framework, incluso los programas compilados con AOT deben incluir información de clase en el archivo binario final generado. Los archivos de clase se organizan de forma ordenada en el área de recursos del archivo binario.

Las siguientes herramientas pueden escanear y extraer información de clase de archivos binarios compilados por AOT

Las siguientes herramientas pueden escanear y extraer información de clase de archivos binarios compilados por AOT

https://github.com/3-keys/lector-de-archivos-de-clase-binarios

git clone https://github.com/3-keys/binary-classfile-reader
cd binary-classfile-reader
./gradlew run --args='<path-of-the-binary-file> <output-folder>'

Usando petclinic-jpa, obtenido en el paso anterior, como ejemplo, extraiga la información de clase y compárela con el código fuente. Puede ver que se puede obtener la información del modelo, del controlador y del servicio.

img