JAVA程序保护02_GraalVM(java保护权限)
Java AOT(Ahead-Of-Time)编译是与 JIT(Just-In-Time)相对的一种编译方式。在 AOT 模式下,Java 字节码(Bytecode)在程序运行之前,就被提前编译为目标平台的本地机器代码。
看到这句话,会不会有点小激动。不使用字节码了,编译成本地机器码,岂不是一步到位,和C++程序差不多难反编译了,果真如此的话,那AOT是JAVA程序保护的第一解决方案。
动手试一下:搜索,找到了GraalVM。
GraalVM是Oracle开源的一款通用虚拟机产品,被誉为新一代的通用多语言高性能虚拟机。它可以运行多种编程语言,如Java、JavaScript、Python等,并提供了即时编译(JIT)和AOT编译(AOT)的支持。GraalVM还支持在不同语言之间互相调用,以及嵌入到其他应用程序中使用,这使得GraalVM成为一个非常强大和灵活的工具,可以满足不同应用场景的需求。
安装教程参见:
https://zhuanlan.zhihu.com/p/673241258
是否安装好验证:
- 在d:\test下建文件HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World! ");
}
}
- 到cmd中依次运行
javac HelloWorld.java
native-image HelloWorld
Helloworld
相当完美,helloworld.exe被创建且能正确执行。
环境装好了,HelloWorld跑通了,接下来要生成自己写的应用程序的EXE。
- 用IDEA打开自己的项目
- 修改POM.XML,加入AOT Graalvm 插件
<!-- AOT Graalvm 插件 -->
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- <version>3.5.1</version> -->
<!-- 指定maven编译的jdk版本。对于JDK8,写成8或者1.8都可以 -->
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
完成后如图:
- 生成EXE步骤
勾选
清空target目录
Java编译成class
处理AOT
生成EXE
等上几分钟,如果一切顺利,在项目的target目录下将生成EXE文件
急切地运行EXE,很不幸,报异常了:
查资料才知道,GraalVM不支持反射、动态类的加载这些东东。一般的应用系统都是基于SPRING BOOT的,Spring Boot 中的注解处理主要基于反射(Reflection)机制。官方虽然给了一个带agentlib参数运行JAR包的方案,但是要你最好把系统的所有功能都点一遍(晕死)。
结论:Java AOT编译和GraalVM看起来很美,实际是个坑货,编译出EXE后运行起来一堆错,放弃此路线。