我有一个使用Maven 3的多模块Scala项目。 我想确保Scala编译器在Java编译器之前运行,包括编译和测试编译阶段。
我已经尝试过,在我的父POM和模块POM中,列出构建部分中的插件,以便Scala编译器插件是第一个,但是Maven仍然坚持首先运行Java编译,但在某些情况下,它会失败我有混合来源。
我知道我可以通过将Scala编译绑定到process-resources而不是compile来解决这个问题,但我真的更愿意知道如何告诉Maven订购插件(或者这是否可行)。
以下是我的父POM中定义这两个插件的部分:
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
<phase>compile</phase>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>testCompile</goal>
</goals>
<phase>test-compile</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
子模块有自己的&lt; plugins&gt;部分,但不重新定义这些插件(只是exec-maven-plugin)。
答案 0 :(得分:7)
The Maven development team has confirmed目前无法完全控制阶段内插件执行的顺序,除非您编写自己的自定义生命周期并使用自定义程序包类型。
我已经为他们创建了an enhancement request in JIRA来考虑解决这个问题。如果这是一个问题,请投票支持。
目前看来,针对此特定问题(混合Java / Scala编译)的“最佳实践”解决方法是将scala:compile编译为process-resources,将scala:testCompile绑定到process-test-resources,如指定的那样在http://scala-tools.org/mvnsites/maven-scala-plugin/example_java.html
答案 1 :(得分:1)
你可以一起运行2个单独的目标,maven将按顺序执行目标:
mvn scala:compile compiler:compile
答案 2 :(得分:1)
要编译混合的Java / Scala项目,它实际上比只是编译一个然后另一个更复杂。除此之外,Scala编译器还能够解析Java文件,以匹配您从Scala使用的任何Java类的签名。编译器基本上可以为你做正确的事情,但你必须先告诉它这样做。
最好的办法是使用SBT而不是Maven,因为除了正确的编辑顺序之外,它还可以提供许多好处。
如果不能选择离开Maven,请按照maven-scala-plugin的配置说明进行操作:http://scala-tools.org/mvnsites/maven-scala-plugin/example_java.html
答案 3 :(得分:-1)
maven编译器插件的id
是default-compile
吗?如果没有,你可以设置它并尝试它是否有效?
如果没有,您可以使用相关的pom代码段和maven运行中的代码段来更新问题。