21

主要问题

我想做的事情相当容易。或者你会这么想。但是,没有任何工作正常。

要求: 使用maven,使用AspectJ编译器编译Java 1.6项目。

注意: 我们的代码不能用 javac 编译。也就是说,如果没有编织切面(因为我们有软化异常的切面),它会导致编译失败。


2011 年 2 月 21 日更新: 有两种同样可行的解决方案(两种情况都使用aspectj-maven-pluginmaven-compiler-plugin):

  1. 添加 <failOnError>false</failOnError> 到编译器插件(感谢 Pascal Thivent
  2. 添加<phase>process-sources</phase> 到 aspectj 编译器插件(感谢Andrew Swan

有关这些解决方案的更多信息,请参见答案部分。我相信解决方案#2 是更好的方法。







相关问题

问题(基于以下失败的尝试):

  1. 如何让 maven 直接运行 aspectj:compile 目标,而无需运行 compile:compile?
  2. 你如何忽略 compile:compile 的失败?
  3. 您如何指定指向您自己的 ajc 编译器的自定义 compilerId(即 make compile:compile 使用除 plexus 之外的 aspectj 编译器)?*
感谢您的任何建议。这些是我尝试过的导致我的问题/问题的事情:


尝试 1(失败): 指定 aspectJ 作为 maven-compiler-plugin 的编译器:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.2</version>
<configuration>
 <source>1.6</source>
 <target>1.6</target>
 <compilerId>aspectj</compilerId>
</configuration>
<dependencies>
 <dependency>
  <groupId>org.codehaus.plexus</groupId>
  <artifactId>plexus-compiler-aspectj</artifactId>
  <version>1.8</version>
 </dependency>
</dependencies>
</plugin>

这失败并出现错误:

org.codehaus.plexus.compiler.CompilerException: The source version was not recognized: 1.6

无论我使用什么版本的 plexus 编译器(1.8、1.6、1.3 等),这都不起作用。我实际上通读了源代码,发现这个编译器不喜欢Java 1.5以上的源代码。

尝试 2(失败): 使用附加到 compile 和 test-compile 目标的 aspectJ-maven-plugin:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
 <source>1.6</source>
 <target>1.6</target>
</configuration>
<executions>
 <execution>
  <goals>
   <goal>compile</goal>      
   <goal>test-compile</goal> 
  </goals>
 </execution>
</executions>
</plugin>

运行时失败:

mvn clean test-compile
mvn clean compile

因为它试图在运行 aspectj:compile 之前执行 compile:compile。如上所述,我们的代码不能用 javac 编译——这些方面是必需的。所以 mvn 需要完全跳过 compile:compile 目标并只运行 aspectj:compile。

尝试 3(有效但不可接受):

使用上面相同的配置,但运行:

mvn clean aspectj:compile

这是可行的,因为它构建成功,但它是不可接受的,因为我们需要能够直接运行编译目标和测试编译目标(m2eclipse 自动构建取决于这些目标)。此外,以这种方式运行它需要我们在此过程中阐明我们想要的每个目标(例如,我们需要分发资源和运行测试以及部署测试资源等)

4

4 回答 4

16

AspectJ 插件的 1.3 版故意将其编译目标的默认阶段从process-sources更改为compile,请参阅MASPECTJ-13这会导致像你的或MASPECTJ-92这样的后续问题。要恢复之前在 javac 之前运行 ajc 的行为,您只需要在相关的“执行”标签中添加一个“阶段”标签,如下所示:

<execution>
    <phase>process-sources</phase> <!-- or any phase before compile -->
    <goals>
        <goal>compile</goal>
        <goal>test-compile</goal>
    </goals>
</execution>
于 2011-02-18T05:43:26.887 回答
4

如何告诉 maven-compiler-plugin 跳过所有 *.java 文件并让 aspectj-maven-plugin 完成这项工作?

...
<build>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.0.2</version>
      <configuration>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>aspectj-maven-plugin</artifactId>
      <version>1.3</version>
      <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>utf-8</encoding>
        <complianceLevel>1.6</complianceLevel>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>       <!-- weave main classes -->
            <goal>test-compile</goal>  <!-- weave test classes -->
          </goals>
        </execution>
       </executions>
    </plugin>
  </plugins>
</build>
于 2010-06-29T16:26:54.437 回答
2

我在一个项目中使用了这个配置来使用 Maven 编译 AspectJ 和 Java 6:

<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.6.8</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.3</version>
            <configuration>
                <complianceLevel>1.6</complianceLevel>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>  
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

参考:aspectj-maven-plugin

于 2010-04-09T21:39:54.910 回答
1

您如何指定指向您自己的 ajc 编译器的自定义 compilerId(即 make compile:compile 使用除 plexus 之外的 aspectj 编译器)?

我不知道如何指定“官方”compilerId之外的其他内容。不确定这是否可能。

我的理解是http://jira.codehaus.org/browse/MCOMPILER-107可以解决您的问题(AspectJ 1.6+ 确实支持 Java 1. 6 对吗?)。可悲的是,它仍然是开放的。

你如何忽略 compile:compile 的失败?

Maven Compiler 插件compiler:compile目标有一个可选参数,允许指示即使存在编译错误,构建是否会继续failOnError

<project>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <failOnError>false</failOnError>
          ...
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

对于上述问题,这可能是一个丑陋的解决方法。

如何让 maven 直接运行 aspectj:compile 目标,而无需运行 compile:compile?

问题在于它compiler:compile与阶段绑定,compile并且您无法删除默认的生命周期绑定。因此,也许还有另一种选择,但我唯一能想到的就是使用 a关闭<packaging>pom<packaging>所有内容并手动重新绑定所有目标(至少对于这些阶段:process-resources, compile, process-test-resources, test-compile, test, package)。从示意图上看,是这样的:

流程资源资源:资源
编译方面j:编译
流程测试资源资源:testResources
测试编译器:testCompile
测试万无一失:测试
包 ejb:ejb 或 ejb3:ejb3 或 jar:jar 或 par:par 或 rar:rar 或 war:war
安装安装:安装
部署部署:部署

这可能是另一个丑陋的解决方法。免责声明:未经测试,但应该可以工作。

于 2010-04-09T21:08:07.947 回答