主要问题
我想做的事情很简单。或者你会这样认为。然而,没有什么是正常工作的。
需求: 使用Maven编译Java 1.6项目,使用AspectJ编译器。
注意: 我们的代码无法使用javac编译。也就是说,如果没有编织方面(因为我们有使异常变得软化的方面),它将无法通过编译。
更新2/21/2011: 对此有两个同样可行的解决方案(两种情况都使用aspectj-maven-plugin与maven-compiler-plugin):
- 在编译器插件中添加
<failOnError>false</failOnError>
(感谢 Pascal Thivent) - 在AspectJ编译器插件中添加
<phase>process-sources</phase>
(感谢Andrew Swan)
有关这些解决方案的更多信息请参见答案部分。我认为第二种解决方案是更好的方法。
相关问题
问题(基于下面的失败尝试):
- 如何让maven直接运行aspectj:compile目标,而不运行compile:compile?
- 如何忽略compile:compile的失败?
- 如何指定自定义的compilerId,该compilerId指向您自己的ajc编译器(也就是说,使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(失败): 在编译和测试编译目标中使用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编译,而是需要使用aspects。因此,mvn需要完全跳过compile:compile目标,并仅运行aspectj:compile。
尝试3(可行但不可接受):
使用与上面相同的配置,但运行以下命令:
mvn clean aspectj:compile
这个方法有效,可以成功构建,但它是不可接受的,因为我们需要能够直接运行compile目标和test-compile目标(m2eclipse自动构建取决于这些目标)。此外,以这种方式运行需要我们逐个列出每个目标(例如,我们需要分发资源并运行测试并部署测试资源等)。