Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AspectJ在没有-javaagent参数的情况下不会运行_Java_Aop_Aspectj_Aspect_Aspectj Maven Plugin - Fatal编程技术网

AspectJ在没有-javaagent参数的情况下不会运行

AspectJ在没有-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...");

我试图在一个简单的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...");
    }

    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插件配置中,就可以了。