我为AspectJ使用哪个maven插件?

2022-09-02 13:22:30

我正在尝试使用java 6.0将aspectaj添加到maven项目中。浏览四周,我发现了2个maven插件,其中没有一个按照我期望的方式工作。

第一个 http://mojo.codehaus.org/aspectj-maven-plugin 最初通过netbeans不起作用,因为我无法获得编译5.0或更高版本源代码的代码(它抱怨注释等)。在从有效的命令行尝试并比较执行的命令后,似乎其mavens安装目标与插件和java 5 +代码不兼容,而编译目标工作正常。尽管有可能解决这个问题,但它很烦人,并给我带来了一个问题:aspectj-maven-plugin是否仍在开发中?我应该继续使用它吗?

第二个是apaches自己的,看起来更活跃,更有可能工作。但是,我找不到任何完整的示例,我无法运行它。我不断从maven那里得到一个例外:

java.lang.IllegalStateException: The plugin descriptor for the plugin Plugin [maven:maven-aspectj-plugin] was not found. Please verify that the plugin JAR /home/kristofer/.m2/repository/maven/maven-aspectj-plugin/4.0/maven-aspectj-plugin-4.0.jar is intact.

jar文件就在那里,完好无损,我使用哪个版本的插件也没关系,它总是抛出相同的异常。对问题可能是什么有任何想法吗?

简而言之,我应该如何使用哪个插件?

谢谢


答案 1

这是一个适合我的设置(使用记录不足的aspectj-maven-plugin)。

项目结构如下:

$ tree .
.
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── stackoverflow
    │               └── Q3651690
    │                   ├── App.java
    │                   └── DontWriteToTheConsole.aj
    └── test
        └── java
            └── com
                └── stackoverflow
                    └── Q3651690
                        └── AppTest.java

具有以下小演示方面:

public aspect DontWriteToTheConsole {

    pointcut sysOutOrErrAccess() : get(* System.out) || get(* System.err);

    declare error
      : sysOutOrErrAccess()
      : "Don't write to the console";

}

pom.xml的配置如下:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.stackoverflow.Q3651690</groupId>
  <artifactId>Q3651690</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>Q3651690</name>
  <properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.6.7</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.3</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal><!-- to weave all your main classes -->
              <goal>test-compile</goal><!-- to weave all your test classes -->
            </goals>
          </execution>
        </executions>
        <configuration>
          <source>${maven.compiler.source}</source>
          <target>${maven.compiler.target}</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

关键部分是:

  • 为 1.6 源代码级别配置 maven-compiler-plugin(这是使用properties)
  • 为1.6源代码级别配置aspectj-maven-plugin(我在这里重用了用于配置maven-compiler-plugin)properties

第二步似乎是多余的,但是,好吧,事情就是这样。

通过这种方式,我能够使用注释等编织代码:

$ mvn clean install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Q3651690
[INFO]    task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/pascal/Projects/stackoverflow/Q3651690/src/main/resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to /home/pascal/Projects/stackoverflow/Q3651690/target/classes
[INFO] [aspectj:compile {execution: default}]
[ERROR] Don't write to the console
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Compiler errors:
error at System.out.println( "Hello World!" );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/App.java:11:0::0 Don't write to the console
    see also: /home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/DontWriteToTheConsole.aj:8::0
...

答案 2

您可以使用 Maven 编译器插件并将编译器更改为使用 AspectJ。

配置如下所示:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.1</version>
    <configuration>
        <compilerId>aspectj</compilerId>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-compiler-aspectj</artifactId>
            <version>1.6</version>
        </dependency>
    </dependencies>
</plugin>

资源:

关于同一主题:


推荐