20

今天,我一直在尝试找到一个合适的解决方案来设置一个包含 Java 和 Scala 代码(它们之间具有双向依赖关系)的 maven 项目。

我发现的解决方案通常包括在阶段调用 scala-maven-plugin 或 maven-scala-pluginprocess-resources以便它在默认的 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-plugin 页面: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 编译,它编译 Java 和 Scala 代码,因此当 maven 编译器插件在阶段process-resources运行时,.class 文件都准备好了。compile

问题是这个解决方案对我来说看起来并不干净。在编译阶段之前调用 Scala 编译过程只是为了确保它在 maven 编译器插件看起来“hacky”之前运行。

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>

我想知道为什么这个解决方案不是博客文章或官方插件页面上建议的解决方案。这种方法有什么缺点吗?使用第二种解决方案而不是第一种解决方案有什么问题吗?

4

1 回答 1

12
  • 是的,解决方案是“hacky”,但 maven-compiler-plugin 始终是第一个在编译阶段运行的插件(就像硬编码到 maven 中一样)。
  • 我没有使用 scala 2.11 进行测试,但以前版本的 scalac 不会将 .java 编译为 .class(仅解析它们)。并且 scala-maven-plugin 从 2.7 开始可以与“每个版本的 scala”一起运行。
于 2015-11-22T12:46:04.350 回答