Maven:在一个项目中混合Java和Scala
今天,我一直在试图找到一个合适的解决方案来建立一个maven项目,该项目包含Java和Scala代码(它们之间有双向依赖关系)
我发现的解决方案通常包括在process-resources
阶段调用scala maven插件或maven scala插件,使其在默认maven编译器插件之前运行(示例:http://www.hascode.com/2012/03/snippet-mixing-scala-java-in-a-maven-project/,https://itellity.wordpress.com/2014/08/21/mixing-scala-and-java-in-a-maven-project/,
scala maven的官方插件页面:http://davidb.github.io/scala-maven-plugin/example_java.html)
这就引出了如下解决方案:
<build>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<recompileMode>incremental</recompileMode>
<executions>
<execution>
<id>scala-compile</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
这个解决方案运行良好——Scala编译在process-resources
阶段调用,它编译Java和Scala代码。当maven编译器插件在compile
阶段运行时,类文件都准备好了
问题是这个解决方案在我看来并不干净。在编译阶段之前调用Scala编译过程,只是为了确保它在maven编译器插件出现“黑客”之前运行
Scala编译器编译Java类,所以我想我可以完全关闭默认的maven编译器插件,然后Scala编译器可以在compile
阶段运行。在我看来,它看起来干净多了,尽管配置有点长:
<build>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<recompileMode>incremental</recompileMode>
<executions>
<execution>
<id>scala-compile</id>
<phase>compile</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>default-compile</id>
<phase>none</phase>
</execution>
<execution>
<id>default-testCompile</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
我想知道为什么这个解决方案不是博客帖子或官方插件页面上建议的解决方案。这种方法有什么缺点吗?使用第二种解决方案而不是第一种解决方案,我是否会遇到任何问题
# 1 楼答案