Java AspectJ';此接合点';抛出异常

Java AspectJ';此接合点';抛出异常,java,aspectj,Java,Aspectj,我正在使用AspectJ和“ajc”命令行编译器。在编译过程中,我在类路径('-cp')上指定了aspectjrt.jar、aspectjtools.jar和aspectjweaver.jar,但是当我调用标准的“thisJoinPoint”时,会引发一个异常: 汇编: ajc -cp lib/aspectjrt.jar:lib/aspectjtools.jar:lib/aspectjweaver.jar -inpath work/src/ -outjar ./mynewjar.jar @wor

我正在使用AspectJ和“ajc”命令行编译器。在编译过程中,我在类路径('-cp')上指定了aspectjrt.jar、aspectjtools.jar和aspectjweaver.jar,但是当我调用标准的“thisJoinPoint”时,会引发一个异常:

汇编:

ajc -cp lib/aspectjrt.jar:lib/aspectjtools.jar:lib/aspectjweaver.jar -inpath work/src/ -outjar ./mynewjar.jar @work/source.lst
导致异常的代码:

before() : onCreateCall() {
    System.out.println("[-] PC Info: " + thisJoinPoint.getSignature());
}
例外情况本身:

Could not find class 'org.aspectj.runtime.reflect.Factory', referenced from method com.test.WooAspects.ajc$preClinit
当然,我已尝试使用以下内容指定导入,但没有成功:

import org.aspectj.runtime.reflect.Factory;
import org.aspectj.runtime.reflect.*;

有什么想法吗?

编译代码时,如果它引用了单独库中的类型,那么该库(可能打包为
.jar
)需要在编译类路径上可用(
javac
ajc

运行代码时,如果它引用单独库中的类型,则该库需要在运行时类路径(
java
或aspectj的替代品)上可用


请注意,
import
语句与类路径无关。
import
语句所做的只是允许您使用类型或成员的短名称,而不是其完全限定名称。

乍一看,以下内容似乎有点奇怪:

  • 看起来好像您认为
    -inpath work/src
    实际上意味着包含源文件,但inpath实际上意味着包含类文件。您可能需要的是
    -sourceroot工作/src
  • 然后,您似乎使用了一个名为
    work/source.lst
    的参数文件,您还没有向我们展示该文件,因此我们不知道其中包含的内容—可能有更多的命令行开关,也可能有更多的源文件。我不知道
  • 在ajc类路径上,有三个AspectJ库,但通常只需要aspectjrt.jar。另外两个仅用于加载时编织[LTW](aspectjtools.jar)或在运行时使用AspectJ编译器和其他一些工具(aspectjweaver.jar)
对于Java和AspectJ代码位于同一源代码目录中的简单项目,以下内容对我很有用(插入换行符以提高可读性,但在控制台上都是一行):

ajc
-1.7
-cp lib/aspectjrt.jar
-源根
-把我的
然后像这样运行aspect enhanced JAR(还是控制台上的一行):

java
-cp lib/aspectjrt.jar;我的罐子
de.scrum\u master.app.Application
也就是说,在运行时,您也只需要类路径上的运行时JAR

也许您希望使用像Maven这样的构建工具来管理依赖项和构建过程。您还可以使用Maven Shade或One JAR之类的插件来生成一个包含编译的Java+AspectJ代码和AspectJ运行时的über JAR。那么在运行时类路径没有任何问题,只需调用

java -jar my_uber.jar

更新:您可能需要阅读以了解更多信息。

发布完整堆栈跟踪。