代码之家  ›  专栏  ›  技术社区  ›  Kristofer

我使用哪个maven插件来实现AspectJ?

  •  19
  • Kristofer  · 技术社区  · 14 年前

    我正在尝试使用Java 6向一个Maven项目添加AspectJ。浏览一下我发现了2个Maven插件,它们都没有达到我所期望的效果。

    第一个 http://mojo.codehaus.org/aspectj-maven-plugin 最初不通过NETBeBeS工作,因为我无法获得代码编译5或更高的源代码(它抱怨注释等),在尝试从命令行中运行和比较命令执行后,似乎它的MaveS安装目标与插件和Java 5 +代码不兼容,而编译目标工作良好。。尽管可能会解决这个问题,但这很烦人,并让我想到一个问题:AspectJ Maven插件是否仍在开发中?我还要用吗?

    第二个是阿帕奇自己的,似乎更积极,更可能工作。但是,我找不到任何完整的示例,因此无法运行它。我一直从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文件就在那里,完好无损,不管我使用哪个版本的插件,它总是抛出相同的异常。有什么问题吗?

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

    谢谢

    3 回复  |  直到 14 年前
        1
  •  17
  •   Pascal Thivent    14 年前

    这里有一个适合我的设置(使用文档中的 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编译器插件(使用 properties )
    • 为1.6源代码级配置AspectJ Maven插件(我重用了 性质 用于在此处配置Maven编译器插件)

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

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

    $ 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
  •  3
  •   Community CDub    7 年前

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

    资源:

    关于同一主题:

        3
  •  2
  •   Ichthyo    14 年前

    我们正在使用AspectJ Maven插件构建几个大型生产级J2EE系统。最近,该插件的开发似乎没有过度活跃。最后一个版本是去年冬天,有一些严重的问题与“aspectlib”和“weavedependences”,这得到了多次报告(即使有附加的错误修复),没有任何来自上游的响应。

    但是不管怎样,基本的功能正在运行,这个插件支持现实项目中需要的大量配置。

    PascalThivent在上面他(非常好)的回答中展示了如何用一个特殊的依赖部分配置插件。您还可以使用此技巧配置 用于编译的实际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运行时添加到项目依赖项中。