【问题标题】:Using AspectJ annotations in maven project: weaving is not working在 maven 项目中使用 AspectJ 注释:编织不起作用
【发布时间】:2018-10-18 16:16:00
【问题描述】:

我试图在一个不使用 Spring 的简单项目中使用 AspectJ,虽然我看到了类似的问题并且我的代码似乎是正确的,但我不明白为什么它不起作用。我使用的是Eclipse Oxygen 4.7.3(不使用AJDT工具)、JDK 7、maven 3.5.2,我的代码如下:

pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com</groupId>
  <artifactId>aspect-tutorial</artifactId>
  <version>0.0.1-SNAPSHOT</version>


<properties>
    <maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.7</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.8</version>
    </dependency>
</dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.8</version>
            <configuration>
                <complianceLevel>1.7</complianceLevel>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>

        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>

    </plugins>
</build>
</project>

MainApp.java

package com.pkg;

public class MainApp {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        HelloWorld a = new HelloWorld();
        a.printHello();
    }
}

HelloWorld.java

package com.pkg;

public class HelloWorld {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void printHello() {
        System.out.println("Print Hello...");
   }

}

TestAspect.java

package com.pkg;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;


@Aspect
public class TestAspect {       

    @Before("execution(* com.pkg.HelloWorld.printHello(..))")
    public void testBefore2(){
        System.out.println("Yeeha");
    }


}

运行 mvn clean install 成功,但输出只打印“Print Hello...”部分。我应该使用不同的方法吗? (也许改用 .aj 文件,或尝试加载时间编织)任何帮助表示赞赏。

【问题讨论】:

    标签: java maven aspectj aspectj-maven-plugin compile-time-weaving


    【解决方案1】:

    您如何运行您的应用程序?纯粹来自 Maven 还是来自 Eclipse?你有 Eclipse 来自动构建你的项目吗?如果是,您可能不会在编译时编织方面取得太大成功,因为 Eclipse 会用 Eclipse 构建的类覆盖您的 Maven 构建的类。如果没有安装 AJDT 功能并正确设置具有 AspectJ 特性的工作区项目,则生成的编译代码不会被 AspectJ 编织器“增强”。

    【讨论】:

    • 我试图从 maven 和 Eclipse 中运行它,以弄清楚它是如何工作的。感谢您的意见,我现在对此有了更好的理解。
    【解决方案2】:

    问题在于 AspectJ Maven 和 Maven 编译器的配置。我的 AspectJ 的 POM 通常看起来与你的有点不同(更多设置),但这里是你的,为了使其工作,只需进行最小的更改:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com</groupId>
      <artifactId>aspect-tutorial</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    
      <properties>
        <maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjrt</artifactId>
          <version>1.8.13</version>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
    
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.11</version>
            <configuration>
              <complianceLevel>1.7</complianceLevel>
              <source>1.7</source>
              <target>1.7</target>
            </configuration>
            <executions>
              <execution>
                <!-- IMPORTANT -->
                <phase>process-sources</phase>
                <goals>
                  <goal>compile</goal>
                  <goal>test-compile</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
              <source>1.7</source>
              <target>1.7</target>
              <!-- IMPORTANT -->
              <useIncrementalCompilation>false</useIncrementalCompilation>
            </configuration>
          </plugin>
    
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.4.0</version>
            <configuration>
              <mainClass>com.pkg.MainApp</mainClass>
            </configuration>
          </plugin>
    
        </plugins>
      </build>
    </project>
    

    看看我如何为 Maven 编译器将增量编译设置为 false?这是由于一个旧错误(仍未修复)实际上反转了开关,因此为了使增量编译工作,您必须“停用”它。很奇怪。

    您还需要为 AspectJ Maven 的 process-sources 阶段定义执行。

    此外,我升级到了 AspectJ Maven 1.11,因此也升级到了 AspectJ 运行时 1.8.13。

    我还添加了 Maven Exec 插件,以便轻松证明它现在可以工作。只需调用mvn clean compile exec:java 并检查输出:

    (...)
    [INFO] --- aspectj-maven-plugin:1.11:compile (default) @ aspect-tutorial ---
    [INFO] Showing AJC message detail for messages of types: [error, warning, fail]
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @ aspect-tutorial ---
    [INFO] Nothing to compile - all classes are up to date
    (...)
    [INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ aspect-tutorial ---
    Yeeha
    Print Hello...
    (...)
    

    否则我支持 Nándor 所说的:如果您还想从 IDE 运行方面增强的 Java 代码,请确保使用适用于 Eclipse 或 IDEA 的 AspectJ 插件。

    【讨论】:

    • 感谢您抽出宝贵时间运行它,现在确实如您所说。不过,我还有一个问题,如何从这个应用程序中构建一个 jar 并将其用作另一个项目(比如 Web 服务)的依赖项并使用工作编织?我尝试了 mvn install 并运行生成的 jar,但出现“NoAspectBoundException”异常。这可能需要一个不同的问题,但如果您能指出正确的方向,我会很高兴。
    • 是的,一个新问题会更好。但是我确定我之前已经在这里回答过了,所以你可以先搜索一下。如果你问,那么请更好地解释你所说的“工作编织”是什么意思。您是在谈论加载时编织,使用此工件作为其他代码的方面库吗?还是只是为了确保编译时编织代码找到它的 AspectJ 运行时类?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2018-02-20
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多