Maven:编译包含Java 1.6源的aspectj项目

主要问题

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

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

注意:我们的代码无法使用javac进行编译。 也就是说,如果未编入方面,则编译失败(因为我们有方面可以软化exception)。


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

  1. false到编译器插件中(感谢Pascal Thivent )
  2. process-sources到aspectj编译器插件中(感谢Andrew Swan )

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


相关问题

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

  1. 如何让maven运行aspectj:直接编译目标,而不运行compile:compile?
  2. 你怎么忽略编译的失败:编译?
  3. 你如何指定一个指向你自己的ajc编译器的自定义compilerId(即make compile:compile使用除了plexus之外的aspectj编译器)?*

感谢您的任何建议。 这些是我尝试过的导致我的问题/问题的事情:


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

  org.apache.maven.plugins maven-compiler-plugin 2.2  1.6 1.6 aspectj    org.codehaus.plexus plexus-compiler-aspectj 1.8    

这失败并出现错误:

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:

  org.codehaus.mojo aspectj-maven-plugin 1.3  1.6 1.6     compile test-compile     

运行时,这会失败:

mvn clean test-compile
mvn clean compile

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

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

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

mvn clean aspectj:compile

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

AspectJ插件的1.3版故意将其编译目标的默认阶段从“process-sources”更改为“compile”。 要恢复之前在javac之前运行ajc的行为,您只需要在相关的“execution”标记中添加“phase”标记,如下所示:

  process-sources   compile test-compile   

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

 ...    maven-compiler-plugin 2.0.2   **/*.java     org.codehaus.mojo aspectj-maven-plugin 1.3  1.6 1.6 utf-8 1.6     compile  test-compile        

我在项目中使用此配置来使用Maven编译AspectJ和Java 6:

   org.aspectj aspectjrt 1.6.8      org.apache.maven.plugins maven-compiler-plugin 2.0.2  1.6 1.6    org.codehaus.mojo aspectj-maven-plugin 1.3  1.6     compile test-compile       

参考: aspectj-maven-plugin

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

我不知道如何指定另一个compilerId不是“官方”的。 不确定是否可能。

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

你怎么忽略编译的失败:编译?

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

  ...  ...  ...  maven-compiler-plugin 2.2  false ...      

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

如何让maven运行aspectj:直接编译目标,而不运行compile:compile?

问题是compiler:compile绑定到compile阶段,并且您无法删除默认的生命周期绑定 。 所以可能有另一种选择,但我唯一能想到的就是通过使用pom关闭所有目标并手动重新绑定所有目标(至少在这些阶段: process-resourcescompileprocess-test-resourcestest-compiletestpackage )。 原理上,这样的事情:

流程资源资源:资源
编译aspectj:编译
 process-test-resources资源:testResources
 test-compile编译器:testCompile
测试surefire:测试
包ejb:ejb或ejb3:ejb3或jar:jar或par:par或rar:rar or war:war
安装安装:安装
部署部署:部署

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