Java 编译时编织时类路径上是否需要AspectJ?

Java 编译时编织时类路径上是否需要AspectJ?,java,aop,aspectj,Java,Aop,Aspectj,几天前我问过,并设法通过编译时编织让它工作起来 但是,当应用程序运行并调用我通过AOP混合到DTO中的toString()方法时,我会得到下面的异常 我不希望运行时类路径中需要AspectJ。毕竟,我使用了编译时编织,所以字节码应该已经处于其最终状态,对吗?为什么希望AspectJ在运行时出现 java.lang.ClassNotFoundException: org.aspectj.lang.NoAspectBoundException at org.eclipse.osgi.inte

几天前我问过,并设法通过编译时编织让它工作起来

但是,当应用程序运行并调用我通过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在生成的字节码中删除对自身的所有引用


注意:我是在OSGi环境中运行的,但这绝对是不相关的。

我相信无论何时编织,您仍然需要AspectJ运行库。

无论您使用编译时编织、编译后编织还是加载时编织,编织的字节码将依赖于少量类型——将它们放在一个jar中比在每个编译的应用程序中生成它们要容易。这些类型封装在小jar“aspectjrt.jar”中。在类路径上不需要weaver jar或编译器jar,只需要一个小的运行时jar。它包含一些不同的内容:

  • 可能用于编写方面的运行时可见注释的定义(@Before,@aspect)
  • 出现问题时的异常类型(NoAspectBoundException)或实现语言功能的异常类型(SoftException)
  • 用于实现某些语言功能的实用程序代码,例如cflow threadlocal堆栈管理
  • 此连接点的所有支持类。当您在此连接点上访问诸如getSignature()之类的内容时,您可能会得到MemberSignature
如果您不使用这些语言特性,那么If可以避免很多这样的情况,但是异常可能仍然是一个问题——即使是最简单的方面也取决于此。目前,没有任何编译方法可以完全避免jar依赖性

可以修改AspectJ来生成额外的代码,以完全避免依赖关系,但这不是一个常见的请求,因此没有对其进行任何工作


(有些aspectjrt.jar版本包含正确的OSGi清单信息,供该环境使用-标准发行版中包含的jar现在没有正确的清单)

我想知道(1)为什么需要它们,(2)使用AspectJ的哪些功能的结果,以及(3)是否有办法删除依赖关系。考虑到您实际上在编译时执行了编织,您的问题有点正确,但在互联网上阅读时,这些问题似乎总是指您必须在类路径中包含aspectjrt.jar文件这一事实。它仍然有一些依赖性,我并不十分熟悉。我想追根究底。我发现了一个不需要aspectjrt.jar的例子:当你用一个空接口来装饰类时,没有方法或字段注入,例如一个空接口,来充当一个标记。