19

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

第一个http://mojo.codehaus.org/aspectj-maven-plugin最初无法通过 netbeans 工作,因为我无法获得编译 5.0 或更高版本源的代码(它抱怨注释等)从命令尝试后行并比较执行的命令似乎它的 Maven 安装目标与插件和 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 文件在那里,完好无损,我使用哪个版本的插件也没关系,它总是抛出相同的异常。关于问题可能是什么的任何想法?

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

谢谢

4

3 回答 3

17

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

项目结构如下:

$树。
.
├── pom.xml
└── 源
    ├── 主要
    │ └── java
    │ └── com
    │ └── stackoverflow
    │ └── Q3651690
    │ ├── App.java
    │ └── DontWriteToTheConsole.aj
    └── 测试
        └── java
            └── com
                └── 堆栈溢出
                    └── 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(我在properties这里重用了用于配置 maven-compiler-plugin)

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

这样,我就能够使用注释等来编织代码:

$ mvn 全新安装
[INFO] 正在扫描项目...
[信息] --------------------------------------------- -------------------------
[INFO] 楼 Q3651690
[INFO] 任务段:[清理,安装]
[信息] --------------------------------------------- -------------------------
[信息] [清洁:清洁 {执行:默认清洁}]
[信息] [资源:资源{执行:默认资源}]
[INFO] 使用 'UTF-8' 编码复制过滤的资源。
[INFO] 跳过不存在的资源目录 /home/pascal/Projects/stackoverflow/Q3651690/src/main/resources
[信息] [编译器:编译{执行:默认编译}]
[INFO] 将 1 个源文件编译到 /home/pascal/Projects/stackoverflow/Q3651690/target/classes
[INFO] [aspectj:编译{执行:默认}]
[错误] 不要写入控制台
[信息] --------------------------------------------- -------------------------
[错误] 构建错误
[信息] --------------------------------------------- -------------------------
[信息] 编译器错误:
System.out.println("Hello World!");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/App.java:11:0::0 不要写入控制台
    另见:/home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/DontWriteToTheConsole.aj:8::0
...
于 2010-09-07T02:09:11.720 回答
3

您可以使用 Maven Compiler 插件并将编译器更改为使用 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>

资源 :

在同一主题上:

于 2010-09-06T13:17:02.517 回答
2

我们正在使用 aspectj-maven-plugin 构建几个大型生产级 J2EE 系统。最近,该插件的开发似乎并不太活跃。最后一次发布是去年冬天,“AspectLib”和“WeaveDependencies”存在一些严重问题,被多次报告(即使附带错误修正),但上游没有任何回应。

但无论如何,基本功能都在工作,而且这个插件支持现实世界项目中需要的大量配置。

Pascal Thivent 在上面的(非常好的)回复中展示了如何使用特殊的依赖部分配置插件。您也可以使用此技巧来配置用于编译的实际 AspectJ 版本,因为此插件默认使用的版本有些过时......

<project xmlns=....

<properties>
    <aspectjVer>1.6.9</aspectjVer>
    ....
    ....
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
....

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.3</version>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                    <version>${aspectjVer}</version>
                </dependency>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>${aspectjVer}</version>
                </dependency>
            </dependencies>
            <configuration>
       ....
</build>
<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${aspectjVer}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId><!-- only needed if you use Spring-AOP -->
        <version>${aspectjVer}</version>
    </dependency>
    ....
    ....

请注意,插件有一个独立于项目的类路径的类路径环境。因此,我们必须将 AspectJ-Runtime 显式添加到项目依赖项中。

于 2010-09-12T00:15:47.760 回答