【问题标题】:Compiling with maven-compiler-plugin and aspectj-maven-plugin使用 maven-compiler-plugin 和 aspectj-maven-plugin 进行编译
【发布时间】:2019-07-08 20:35:36
【问题描述】:

当我使用maven-apsectj-pluginmaven-compiler-plugin compile 阶段将执行两个插件compile 目标。 这导致首先使用javac 进行编译,然后使用ajc 进行完全重新编译。

这种双重编译有必要吗?看来我可以关掉maven-compiler-plugin,一切正常。

我正在使用maven-compiler-plugin 的用法中所述的“默认”配置:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.13</version>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.11</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>       <!-- use this goal to weave all your main classes -->
              <goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  <build>
  ...
</project>

【问题讨论】:

    标签: java maven aspectj aspectj-maven-plugin


    【解决方案1】:

    是的,您可以停用 Maven 编译器插件,因为 AspectJ 编译器是 Eclipse Java 编译器的一个定期更新的分支。因此,它也可以编译您的 Java 文件。

    但如果情况更复杂,例如您使用 Maven Compiler 还编译 Groovy 文件或其他模块中的文件,并且只想在 &lt;pluginManagement&gt; 中配置一次,也许停用它不是一个很好的选择。有一种方法可以让两个插件一起玩得很好,请参阅我的其他答案

    基本上,您将 Maven 编译器配置为使用 &lt;useIncrementalCompilation&gt;false&lt;/useIncrementalCompilation&gt;,将 AspectJ Maven 配置为使用 &lt;phase&gt;process-sources&lt;/phase&gt;。更多信息在链接的答案中。

    然后你会看到这样的输出:

    [INFO] --- aspectj-maven-plugin:1.12.1:compile (default) @ openbook_cleaner ---
    [INFO] Showing AJC message detail for messages of types: [error, warning, fail]
    [INFO] 
    [INFO] --- aspectj-maven-plugin:1.12.1:test-compile (default) @ openbook_cleaner ---
    [WARNING] No sources found skipping aspectJ compile
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ openbook_cleaner ---
    [INFO] Nothing to compile - all classes are up to date
    

    【讨论】:

    • 感谢@kriegaex 的回答。不知道这是否应该是它自己的答案,我可能会提出一个单独的问题,但你似乎是合适的人问。
    • 我有一个项目,它使用编译的方面并在编译时编织它们。不幸的是,Lombok 不支持 AJC。由于这个项目本身没有任何方面的来源,我配置了 AspectJ Maven 插件来进行编译后字节码编织:&lt;forceAjcCompile&gt;true&lt;/forceAjcCompile&gt; &lt;sources/&gt; &lt;weaveDirectory&gt;${project.build.outputDirectory}&lt;/weaveDirectory&gt; 这样,Lombok + Javac 将首先被调用,然后用方面进行修改。在 javac 生成的类上执行字节码编织时是否有任何限制/缺点?
    • 这绝对是一个新问题。请创建一个包含一点MCVE 的内容,即您的(多模块?)Maven 构建与 lomboked 示例类 + 主要方法、方面 - 我可以复制(或从 GitHub 克隆)、完全构建和运行的东西。那我或许可以帮你。
    猜你喜欢
    • 2021-04-18
    • 2018-11-25
    • 2021-02-07
    • 2019-08-20
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2013-07-28
    • 2020-01-01
    相关资源
    最近更新 更多