使用Java命令运行AspectJ加载时编织(LTW)失败求助
解决AspectJ加载时编织(LTW)切面不生效问题
问题诊断
从运行日志可定位两个核心问题:
no configuration found:AspectJ Weaver无法读取到aop.xml配置文件,因为原META-INF目录不在类路径范围内- 即使配置文件被找到,原aop.xml未声明需要织入的切面类,Weaver不知道要处理哪个切面逻辑
解决方案
1. 修正aop.xml配置,添加切面声明
修改aop.xml,新增<aspects>节点指定要加载的切面类:
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> <aspectj> <weaver options="-verbose -showWeaveInfo"> <include within="*" /> </weaver> <!-- 声明要织入的切面类 --> <aspects> <aspect name="HelloWorldAspect" /> </aspects> </aspectj>
2. 调整META-INF目录位置
将根目录下的META-INF文件夹移动到classes目录下,确保配置文件处于类路径中,调整后的目录结构如下:
├── classes │ ├── META-INF │ │ └── aop.xml │ ├── HelloWorld.class │ ├── HelloWorldAspect.class │ └── Runner.class ├── lib │ ├── aspectjrt-1.9.19.jar │ └── aspectjweaver-1.9.19.jar └── src ├── HelloWorld.java ├── HelloWorldAspect.java └── Runner.java
3. 重新运行程序
使用以下命令启动程序,Weaver会自动识别类路径下的aop.xml并完成切面织入:
java -javaagent:lib/aspectjweaver-1.9.19.jar -cp "lib/*:classes/" Runner
若需验证织入过程,可添加verbose参数查看详细日志:
java -javaagent:lib/aspectjweaver-1.9.19.jar -cp "lib/*:classes/" -Daj.weaving.verbose=true Runner
运行后会输出预期结果:
Hello , World
原因说明
- 类加载器仅扫描类路径(此处为
classes/和lib/*)下的META-INF/aop.xml,原根目录的配置文件不在扫描范围内,导致Weaver无法识别配置 - 原aop.xml仅配置了织入规则,但未指定要加载的切面类,Weaver无法确定需要将哪个切面逻辑应用到目标类上
内容的提问来源于stack exchange,提问作者Bishal Thapa
相关产品推荐
相关产品推荐

