今天我一直试图找到一个合适的解决方案来设置一个包含Java和Scala代码的maven项目(它们之间有双向依赖关系)。
我发现的解决方案通常包括在process-resources
阶段调用scala-maven-plugin或maven-scala-plugin,以便它在默认的maven编译器插件之前运行(例如:{{3 },http://www.hascode.com/2012/03/snippet-mixing-scala-java-in-a-maven-project/,
官方scala-maven-plugin页面:https://itellity.wordpress.com/2014/08/21/mixing-scala-and-java-in-a-maven-project/)。
这导致解决方案看起来像这样:
<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>
此解决方案运行良好 - 在process-resources
阶段调用Scala编译,它编译Java和Scala代码,因此当maven编译器插件在compile
阶段运行时,.class文件都已准备就绪。
问题是这个解决方案看起来并不干净。在编译阶段之前调用Scala编译过程只是为了确保它在maven编译器插件之前运行似乎&#34; hacky&#34;。
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>
我想知道为什么这个解决方案不是博客文章或官方插件页面上建议的解决方案。这种方法有什么缺点吗?使用第二种解决方案而不是第一种解决方案是否有任何问题?
答案 0 :(得分:9)