【问题标题】:Which maven plugin do I use for AspectJ?我为 AspectJ 使用哪个 maven 插件?
【发布时间】:2011-04-08 18:40:27
【问题描述】:

我正在尝试将 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 文件在那里,完好无损,我使用哪个版本的插件也没关系,它总是抛出相同的异常。关于问题可能是什么的任何想法?

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

谢谢

【问题讨论】:

    标签: java maven-2 plugins netbeans aspectj


    【解决方案1】:

    您可以使用 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>
    

    资源:

    关于同一主题:

    【讨论】:

    • 我试过了,但我的方面没有添加到课程中。默认的方面文件夹是什么?我可以指定吗?我目前使用 src/main/aspect。 .aj 文件是否被拾取?
    • 如果你想在构建时将 oget 的内容复制到根源文件夹,请放入 src/main/resources
    • 它们仍然没有被编织,我尝试了 src/main/java 和 src/main/resources
    【解决方案2】:

    这是一个适合我的设置(使用下面记录的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(我在这里重用了用于配置 maven-compiler-plugin 的 properties

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

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

    $ 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 ...

    【讨论】:

    • 我们也在使用 aspectj-maven-plugin 来用 Maven 编译我们的切面
    • @Pascal 为 1.6 源配置 aspectj-maven-plugin 也修复了我的设置。谢谢:)
    【解决方案3】:

    我们正在使用 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 显式添加到项目依赖项中。

    【讨论】:

    • 举个例子肯定会很有趣!
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多