AspectJ在没有-javaagent参数的情况下不会运行
我试图在一个简单的java应用程序中使用AspectJ,而不使用Spring。 项目由maven控制 这是项目代码,您也可以在 App.javaAspectJ在没有-javaagent参数的情况下不会运行,java,aop,aspectj,aspect,aspectj-maven-plugin,Java,Aop,Aspectj,Aspect,Aspectj Maven Plugin,我试图在一个简单的java应用程序中使用AspectJ,而不使用Spring。 项目由maven控制 这是项目代码,您也可以在 App.java package ge.jibo.aspectj; public class App { public static void main(String[] args) { App app = new App(); app.print("Message from App object...");
package ge.jibo.aspectj;
public class App {
public static void main(String[] args) {
App app = new App();
app.print("Message from App object...");
}
public void print(String value) {
System.out.println(value);
}
}
package ge.jibo.aspectj;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class LoggerAspect {
@Around("execution(!static * *(..))")
public Object dontLogDuplicates(ProceedingJoinPoint thisJoinPoint) throws Throwable {
System.out.println("Message from LoggerAspect object");
return thisJoinPoint.proceed();
}
}
LoggerAspect.java
package ge.jibo.aspectj;
public class App {
public static void main(String[] args) {
App app = new App();
app.print("Message from App object...");
}
public void print(String value) {
System.out.println(value);
}
}
package ge.jibo.aspectj;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class LoggerAspect {
@Around("execution(!static * *(..))")
public Object dontLogDuplicates(ProceedingJoinPoint thisJoinPoint) throws Throwable {
System.out.println("Message from LoggerAspect object");
return thisJoinPoint.proceed();
}
}
aop.xml位于resources\META-INF
目录中
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<aspects>
<aspect name="ge.jibo.aspectj.LoggerAspect"/>
</aspects>
<weaver options="-verbose -showWeaveInfo">
<include within="ge.jibo.aspectj..*"/>
</weaver>
</aspectj>
如果我将带有aspectjweaver-1.9.6.jar
的-javaagent
参数传递给JVM,则执行Aspect对象。
- 如何避免每次都传递此
-javaagent
参数
- 我应该在
pom.xml
中添加一些插件来直接执行方面吗
一个简单的解决方案/解决方法是添加aspectj maven插件
,用于编译时编织(在这种情况下,不再需要aop.xml
文件)
并使用maven assembly plugin
将项目及其依赖项打包到可执行jar中(还有其他方法可以将可执行jar打包为libs/依赖项)
pom.xml
${project.artifactId}
org.codehaus.mojo
如果您不喜欢加载时编织,请改用编译时编织。您可以使用AspectJ Maven插件来实现这一点。你可以在网上找到很多例子,其中很多是我自己写的。@kriegaex谢谢你的回复,你能给我一个适合这个问题的例子的链接吗?你是在这里还是在网上搜索过?首先,你应该读一下这本书。它的文档中也有使用示例。至于我对AspectJ Maven的回答,您可以像这样搜索它们。包含POM示例的更简单的示例是和。@kriegaex我尝试过,但在执行.BTW时,如果不传递“aspectjweaver.jar”参数,它们都无法工作,正如您在POM中清楚地看到的那样,aspectjrt
(AspectJ运行时)是一个依赖项。当然,这个(大小为119K)需要在类路径上,但不是aspectjweaver
(1.9m)。后者是前者的超集,仅用于LTW。如果你喜欢简单,把所有东西都打包到一个可执行的JAR中。很好,我可以帮你解决你的问题。因为您提到了其他uber JAR解决方案:一个是一个JAR,请参阅。它还包含一个指向我提到的其他答案的链接。当然,Maven Assembly也很好,可能更受欢迎,因为它是主动维护的。我只是习惯于使用一个JAR来开发独立的AspectJ应用程序。是的,你说得对。你的评论对解决这个问题很有帮助。谢谢一个JAR是好的,但如果您重命名生成的JAR,它将无法正常执行。对于程序集,您可以毫无问题地更改名称。您不能重命名JAR是什么意思?如果你说的是由一个JAR生成的uber JAR,当然你可以将它重命名为你心中的内容。JRE不关心JAR名称。请更具体地说明你的问题。你想重命名uber JAR中的任何东西吗?如果是,如何以及何时?你是对的,你可以手动重命名它,它将工作(测试)。更改pom.xml中JAR的名称时出现问题。如果在一个jar插件中添加${project.build.finalName}.${project.packaging},jar的执行将抛出“java.io.EOFException:Unexpected end of ZLIB input stream”异常。我从不这样做,但您可以这样做。但是,对于原始工件和一个jar工件,您不能使用完全相同的文件名,这正是您试图做的。这是一个错误。因此,首先,您告诉maven jar插件使用类似于${project.build.finalName}.orig
(不带扩展!)的东西,从而产生my_artifact-1.2.orig.jar
。然后将相应的${project.build.finalName}.orig.${project.packaging}
加上${project.build.finalName}.${project.packaging}
添加到One-JAR插件配置中,就可以了。