AspectJ'thisJoinPoint'抛出异常

时间:2014-06-28 20:15:10

标签: 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 @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.*;

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

编译代码时,如果它引用单独库中的类型,那么该库(可能打包为.jar)需要在编译类路径(javacajc上可用。在这种情况下)。

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

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

答案 1 :(得分:0)

乍一看似乎有点奇怪:

  • 看起来好像你认为-inpath work/src实际上是包含源文件,但inpath实际上意味着包含类文件。你可能想要的是-sourceroots work/src
  • 然后你似乎使用了一个你没有向我们展示的名为work/source.lst的参数文件,所以我们不知道那里有什么 - 可能有更多的命令行开关,也许更多的源文件。我不知道。
  • ajc 类路径中,有三个AspectJ库,但通常只需要 aspetcjrt.jar 。另外两个仅用于加载时编织[LTW]( aspectjtools.jar ),或者如果您想在运行时使用AspectJ编译器和一些其他工具( aspectjweaver.jar < / em>的)。

对于Java和AspectJ代码位于同一源目录中的简单项目,以下内容适用于我(插入换行符以提高可读性,但控制台上只有一行):

ajc
    -1.7
    -cp lib/aspectjrt.jar
    -sourceroots src
    -outjar my.jar

然后你像这样运行方面增强的JAR(在控制台上又一行):

java
    -cp lib/aspectjrt.jar;my.jar
    de.scrum_master.app.Application

即。在运行时,您还需要在类路径上使用运行时JAR。

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

java -jar my_uber.jar

更新:您可能需要阅读ajc documentation了解详情。