这个问题通常发生在使用AspectJ LTW(Load-Time Weaving)时,Spring Boot应用程序内置Tomcat的情况下。AspectJ LTW是一种在运行时通过修改字节码来实现AOP的技术,而内置Tomcat使用了不同的类加载器来加载应用程序和AOP库。
解决这个问题的方法是在Spring Boot应用程序的启动参数中添加一个额外的命令行参数,以允许非法访问。具体步骤如下:
@SpringBootApplication
注解的类)。main
方法中添加一个额外的命令行参数,格式为--add-opens
。--add-opens
命令行参数的值设置为"java.base/java.lang=ALL-UNNAMED",表示允许所有的非法访问。以下是一个示例代码,展示了如何在Spring Boot应用程序中添加--add-opens
命令行参数:
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
// 添加 --add-opens 命令行参数
String illegalAccessParam = "--add-opens=java.base/java.lang=ALL-UNNAMED";
System.setProperty("spring.devtools.restart.enabled", "false"); // 禁用 DevTools,以避免重复加载
SpringApplication.run(MyApp.class, appendArgs(args, illegalAccessParam));
}
// 辅助方法,用于添加命令行参数
private static String[] appendArgs(String[] args, String arg) {
String[] newArgs = new String[args.length + 1];
System.arraycopy(args, 0, newArgs, 0, args.length);
newArgs[args.length] = arg;
return newArgs;
}
}
这个解决方法应该能够解决"AspectJ LTW + Spring Boot + 内置 Tomcat 违法访问"的问题。如果仍然遇到问题,请确保使用的是相应版本的AspectJ和Spring Boot,并检查是否有其他冲突或配置错误。