我正在尝试将 aop.xml 的配置外部化,因此我删除aop.xml
了META-INF
它并使其在服务器中可供系统管理员手动配置。
当我尝试使用外部 aop.xml 时
-Dorg.aspectj.weaver.loadtime.configuration="file:D:\Workspace\tomcat7\shared\lib\aop.xml"
我得到java.lang.RuntimeException: Cannot register non aspect: aspectclass....
主要是因为那时还没有加载aj casses AppClassLoader
。下次它尝试从WebAppClassLoader
(加载所有类之后)注册方面时,它工作正常,但我仍然得到第一次尝试注册它时记录的异常。
异常被捕获并记录在ClassLoaderWeavingAdaptor.java
第 307 行。
当调用以下行时:success = registerAspects(weaver, loader, definitions);
捕获并记录异常。
try {
registerOptions(weaver, loader, definitions);
registerAspectExclude(weaver, loader, definitions);
registerAspectInclude(weaver, loader, definitions);
success = registerAspects(weaver, loader, definitions);
registerIncludeExclude(weaver, loader, definitions);
registerDump(weaver, loader, definitions);
} catch (Exception ex) {
trace.error("register definition failed", ex);
success = false;
warn("register definition failed", (ex instanceof AbortException) ? null : ex);
}
异常在 BcelWeaver.java 的以下行中完全抛出
if (type.isAspect()) {
......
} else {
// FIXME AV - better warning upon no such aspect from aop.xml
RuntimeException ex = new RuntimeException("Cannot register non aspect: " + type.getName() + " , " + aspectName);
if (trace.isTraceEnabled()) {
trace.exit("addLibraryAspect", ex);
}
throw ex;
}
当方面尚未加载时,如何防止类加载器将错误记录到控制台。我正在考虑注释从源文件记录异常的行并重建 aspectjweaver jar 文件,但正在寻找更好的解决方案而不修改 aspectj 源。