我搜索得很远,但没有找到任何可以帮助我解决问题的方法。我正在尝试实现某个功能,我正在创建一个PoC解决方案,但问题是:
它涉及使用编译时编织AspectJ和编译时注释处理器
我不知道如何让这两者同时发挥作用。
到目前为止,我一直在使用aspectj-maven-plugin在* .aj文件中使用AspectJ方面,并且它工作正常。一旦我尝试使用maven-compiler-plugin添加注释处理,问题变得明显:在编译阶段由aspectj-maven-plugin生成的目标目录中的编织类被maven-compiler-plugin覆盖它在编译阶段产生的类。
控制台输出说首先是aspectj-maven-plugin完成它的工作并编织所有类:
[INFO] --- aspectj-maven-plugin:1.10:compile (default) @ demo ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
...and a list of all the Join Points and Intertypes done
然后maven-compiler-plugin开始工作并重新编译所有内容(并使用注释处理器生成类):
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to dir\demo\target\classes
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:compile (compile-project) @ demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 19 source files to dir\demo\target\classes
以下是pom.xml的相关部分:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<compilerArgument>-proc:none</compilerArgument>
<includes>
<include>
path/to/annotation/processor/Processor.java
</include>
</includes>
</configuration>
</execution>
<execution>
<id>compile-project</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.10</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<complianceLevel>${maven.compiler.source}</complianceLevel>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
另外,方面和注释处理器都可以正常工作,因此它们没有特别的问题,我认为问题是构建配置。
我猜测我要么搞乱插件中的执行/阶段,要么我甚至不需要同时使用它们,也许只有一个适当的配置就足够了,但我不知道如何将编译与ajc结合并运行注释处理器(并分两个阶段,首先使用proc none来编译Annotation Processor本身,然后再进行注释处理)。请帮忙!
答案 0 :(得分:0)
对我来说,到目前为止最好的策略是在使用AspectJ编译器时完全禁用Java编译器,并让AspectJ编译器单独执行注释处理和编译。示例maven构建配置如下所示:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<skipMain>true</skipMain>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
如果由于某种原因这对您不起作用,您可以尝试仅使用Java编译器进行注释处理,让AspectJ编译器完成剩下的工作。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<proc>only</proc>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<configuration>
<proc>none</proc>
</configuration>
</plugin>
</plugins>
</build>
我还看到你的构建文件中定义了太多的执行(java编译器为2 default-compile
+ compile-project
),非默认执行ID。我建议你只保留默认执行的默认ID,除非你有特定的理由让它们使用。