java - 在一个项目中使用Aspectj编译时编织和Java编译时注释处理

标签 java aspectj annotation-processing compile-time-weaving

我进行了广泛的搜索,但没有找到任何可以帮助我解决问题的内容。我正在尝试实现某个功能,并且正在创建一个 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 编译注释处理器本身,然后进行注释处理)。请帮忙!

最佳答案

对我来说,迄今为止最好的策略是在使用 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,除非您有特定原因需要使用它们。

关于java - 在一个项目中使用Aspectj编译时编织和Java编译时注释处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47290859/

相关文章:

annotation-processing - 在我的项目源码包下生成java源码

java - Java DB 何时以及如何更新并与 Apache Derby 同步?

java - 打印字节数组的最短可理解形式

java - 在 AsyncTask 中运行 CountDownTimer 会抛出 java.lang.RuntimeException - Looper.prepare()

java - AspectJ EDT-Checker 代码问题

java - aspectj 中注释的优先顺序

java - 无法将我的任何项目导出到 .jar 文件中

java - 您可以指定一个对应于 AspectJ 中的每一行执行的切入点吗

java - Android Annotation处理器访问资源(assets)

java - 二进制/合格名称错误?以 : <any? >$ 开头