【发布时间】:2021-06-30 00:42:12
【问题描述】:
我有带有 Spring Boot 和 AspectJ 的 Gradle 项目。
想要直接从 WEB-INF/libs(Spring Boot 定位所有依赖项)动态加载 aspectjweaver 和 spring-instrument javaagents
Gradle 依赖项:
代理加载器:
public class AgentLoader {
private static final Logger LOGGER = LoggerFactory.getLogger(AgentLoader.class);
public static void loadJavaAgent() {
if (!isAspectJAgentLoaded()) {
LOGGER.warn("Aspect agent was not loaded!");
}
}
public static boolean isAspectJAgentLoaded() {
try {
Agent.getInstrumentation();
} catch (NoClassDefFoundError e) {
return false;
} catch (UnsupportedOperationException e) {
LOGGER.info("Dynamically load AspectJAgent");
return dynamicallyLoadAspectJAgent();
}
return true;
}
public static boolean dynamicallyLoadAspectJAgent() {
String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
int p = nameOfRunningVM.indexOf('@');
String pid = nameOfRunningVM.substring(0, p);
try {
VirtualMachine vm = VirtualMachine.attach(pid);
String jarFilePath = AgentLoader.class.getClassLoader().getResource("WEB-INF/libs/aspectjweaver-1.9.6.jar").toString();
vm.loadAgent(jarFilePath);
jarFilePath = AgentLoader.class.getClassLoader().getResource("WEB-INF/libs/spring-instrument-5.3.2.jar").toString();
vm.loadAgent(jarFilePath);
vm.detach();
} catch (Exception e) {
LOGGER.error("Exception while attaching agent", e);
return false;
}
return true;
}
}
但是在null中发现getResource()的返回值
处理此问题的最佳解决方案是什么?
【问题讨论】:
-
欢迎来到 SO。有趣的问题。请帮助我一点,这样我就可以帮助你。只需在 GitHub 上发布一点MCVE,这样我就可以重现该问题。我不是 Spring Boot 或 Gradle 用户,我是 Maven 人。但是,如果我有一个工作项目设置,我可以使用 AspectJ 查看您的类加载器问题。我需要查看 uber JAR 是如何打包的,在执行代理加载器类时使用了哪个类加载器,以及该类加载器是如何/何时启动的。
标签: java spring-boot gradle war aspectj