我正在使用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.*;
有什么想法吗?
答案 0 :(得分:1)
编译代码时,如果它引用单独库中的类型,那么该库(可能打包为.jar
)需要在编译类路径(javac
或ajc
上可用。在这种情况下)。
运行代码时,如果它引用了单独库中的类型,那么该库需要在运行时类路径(java
或aspectj的替代方法)上可用。
请注意,import
语句与类路径无关。所有import
语句都允许您使用类型或成员的短名称而不是其完全限定名称。
答案 1 :(得分:0)
乍一看似乎有点奇怪:
-inpath work/src
实际上是包含源文件,但inpath实际上意味着包含类文件。你可能想要的是-sourceroots work/src
。work/source.lst
的参数文件,所以我们不知道那里有什么 - 可能有更多的命令行开关,也许更多的源文件。我不知道。对于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了解详情。