Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个项目中使用Aspectj编译时编织和Java编译时注释处理_Java_Aspectj_Annotation Processing_Compile Time Weaving - Fatal编程技术网

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

在一个项目中使用Aspectj编译时编织和Java编译时注释处理,java,aspectj,annotation-processing,compile-time-weaving,Java,Aspectj,Annotation Processing,Compile Time Weaving,我到处寻找,没有找到任何能帮助我解决问题的东西。我正在尝试实现某种功能,并正在创建PoC解决方案,但问题在于: 它涉及使用编译时编织的AspectJ和编译时注释处理器 我不知道如何让这两个同时工作 到目前为止,我只在带有AspectJ maven插件的*.aj文件中使用了AspectJ方面,它工作得很好。但是,当我尝试使用maven编译器插件添加注释处理时,一个问题就出现了:aspectj maven插件在编译阶段生成的目标目录中的编织类被maven编译器插件在编译阶段生成的类覆盖 控制台输出表

我到处寻找,没有找到任何能帮助我解决问题的东西。我正在尝试实现某种功能,并正在创建PoC解决方案,但问题在于:

它涉及使用编译时编织的AspectJ和编译时注释处理器

我不知道如何让这两个同时工作

到目前为止,我只在带有AspectJ maven插件的*.aj文件中使用了AspectJ方面,它工作得很好。但是,当我尝试使用maven编译器插件添加注释处理时,一个问题就出现了:aspectj maven插件在编译阶段生成的目标目录中的编织类被maven编译器插件在编译阶段生成的类覆盖

控制台输出表明,首先aspectj maven插件完成工作并编织所有类:

[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编译器插件开始工作并重新编译所有内容(并使用注释处理器生成类):

以下是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>

org.springframework.boot
springbootmaven插件
org.apache.maven.plugins
maven编译器插件
3.7.0
${maven.compiler.source}
${maven.compiler.target}
默认编译
-过程:无
path/to/annotation/processor/processor.java
编译项目
编译
编译
org.codehaus.mojo
aspectj maven插件
1.10
org.aspectj
aspectjtools
${aspectj.version}
真的
${maven.compiler.source}
${maven.compiler.source}
${maven.compiler.target}
过程源
编译
测试编译
另外,方面和注释处理器都可以正常工作,因此它们不是问题所在,我假设问题在于构建配置


我猜要么我把插件中的执行/阶段搞砸了,要么我甚至不需要同时使用这两个插件,也许只要一个正确的conifgure就足够了,但我不知道如何将编译与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>

org.apache.maven.plugins
maven编译器插件
真的
真的
org.codehaus.mojo
aspectj maven插件
如果出于某种原因,这对您不起作用,您可以尝试仅将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>

org.apache.maven.plugins
maven编译器插件
只有
org.codehaus.mojo
aspectj maven插件
没有一个
我还发现您的生成文件中定义了太多的执行(2个用于java编译器:
default compile
+
compile project
),它们具有非默认执行ID。我建议您只保留默认执行及其默认ID,除非您有特定的原因使用它们。

请参阅:
<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>