【发布时间】:2017-03-20 14:41:31
【问题描述】:
这里是MVCE
https://github.com/yami12376/AspectJ
-
将
VM arguments添加到Run/Debug configuration of Junit test,在我的例子中:-javaagent:C:\aspectjWeaver\spring-instrument-3.0.4.jar
-javaagent:C:\aspectjWeaver\aspectjweaver-1.6.11.jar
就我而言,我在
JAVA build path中添加了这个:\target\classes\META-INFfromsrc/main/resources运行
Junit test
如果你删除aop.xml,它仍然在编织type org.*
但另一方面,aop.xml 不应该编织它,因为它有:
<include within="com.*"/>
为什么它会编织com.*以外的东西?
最后我希望在基于@Around("execution(* *(..))") 运行Junit test 时调用MyAspect
你现在可以看到它没有被调用。
在运行JUnit test 时,我看到了这个错误:
[AppClassLoader@18b4aac2] warning parse definitions failed -- (NullPointerException) null
null
java.lang.NullPointerException
at org.aspectj.weaver.loadtime.definition.DocumentParser.resolveEntity(DocumentParser.java:177)
at org.apache.xerces.util.EntityResolverWrapper.resolveEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.resolveEntity(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.aspectj.weaver.loadtime.definition.DocumentParser.saxParsing(DocumentParser.java:158)
at org.aspectj.weaver.loadtime.definition.DocumentParser.parse(DocumentParser.java:123)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.parseDefinitions(ClassLoaderWeavingAdaptor.java:272)
at org.aspectj.weaver.loadtime.DefaultWeavingContext.getDefinitions(DefaultWeavingContext.java:130)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initialize(ClassLoaderWeavingAdaptor.java:156)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.initialize(Aj.java:340)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.getWeavingAdaptor(Aj.java:345)
at org.aspectj.weaver.loadtime.Aj$WeaverContainer.getWeaver(Aj.java:319)
at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:113)
at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:54)
at sun.instrument.TransformerManager.transform(Unknown Source)
at sun.instrument.InstrumentationImpl.transform(Unknown Source)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
我想修正这个错误
【问题讨论】:
-
为什么你认为你需要 spring-aspects 库?它不是 Spring 应用程序,而是纯 Java。为什么要使用加载时编织?你这样做的理由是什么?使用 AspectJ Maven 插件进行编译时编织会容易得多。很抱歉提出这些问题,但在回答之前我想了解一下。
-
还有一件事:您的 Maven 构建运行 JUnit 测试而没有加载时编织,那么为什么要使用 IDE 中的 LTW 运行它呢?然后,根据运行测试的位置,您正在测试两种不同的东西,这只是糟糕的测试设计。这没有多大意义。
-
" 那么你正在测试两个不同的东西,这取决于你从哪里运行测试,这只是糟糕的测试设计。它没有多大意义。“你是对的 - 但这是我想要的方法如果我的
aspect是否被调用,向您展示(检查自己) - 仅此而已。我的Junit test通常只有1 purpose。 “你为什么认为你需要 spring-aspects 库?”对于这个 MVCE,你是对的——我可以在这里删除它。仍然出现error。这个依赖是否在这里并不重要。 -
@kriegaex " 为什么要使用加载时编织?您这样做的原因是什么?使用 AspectJ Maven 插件进行编译时编织会容易得多。"如果我是正确的,这让我有机会使用我的
junit测试检查我的方面是否通过debbuging工作 - 这对我来说非常舒服。我不想编译我的整个应用程序来查看它是否有效。这是更快的方式。 -
这是不合逻辑的。无论你编织代码固化编译还是加载时间,结果都是一样的。它对可调试性绝对没有影响。可能您不完全理解 AOP 的含义以及具体如何使用 AspectJ。如果您想检查方面是否被正确应用,编写单元或集成测试作为测试套件的一部分自动检查它,不要手动进行。因为那时您就遇到了您描述的问题:您永远不知道它们是如何/是否被应用的。你的构建/测试管理方法是完全错误的,我不会支持它。
标签: java eclipse junit aspectj aspect