我几天前问this question,并设法使用编译时编织工作。
然而,当应用程序运行并调用我通过AOP混入我的DTO的toString()方法时,我得到以下异常。
我没想到在运行时类路径中需要AspectJ。毕竟,我使用了编译时编织,所以字节码应该已经处于最终状态,对吧?为什么AspectJ应该在运行时出现?
java.lang.ClassNotFoundException: org.aspectj.lang.NoAspectBoundException
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:506)[osgi-3.6.2.R36x_v20110210.jar:]
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)[osgi-3.6.2.R36x_v20110210.jar:]
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)[osgi-3.6.2.R36x_v20110210.jar:]
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)[osgi-3.6.2.R36x_v20110210.jar:]
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)[:1.6.0_35]
... 51 more
有没有办法指示AspectJ在结果字节码中删除对自身的所有引用?
N.B。:我在OSGi环境中运行 - 但这绝对不相关。
答案 0 :(得分:3)
无论您使用编译时,编译后编辑时还是加载时编织,编织字节码都会依赖少量类型 - 将它们放在jar中比在每个编译时生成它们更容易应用程序。这些类型封装在小jar“aspectjrt.jar”中。您不需要类路径上的weaver jar或编译器jar,只需要小的运行时jar。它包含一些不同的东西:
如果您不使用这些语言功能,可以避免很多这些,但NoAspectBoundException可能仍然是一个问题 - 即使最简单的方面也将依赖于此。现在没有办法编译会完全避免jar依赖。
可以修改AspectJ以进行额外的代码生成以完全避免依赖,但这不是常见的请求,因此没有完成任何工作。
(有一些aspectjrt.jar的构建,其中包含正确的OSGi清单信息,用于该环境 - 标准发行版中包含的jar目前无法正确显示该清单)
答案 1 :(得分:0)
我相信无论编织何时发生,你仍然需要AspectJ运行时库。