Maven:在一个项目中混合使用Java和Scala

时间:2015-11-20 22:11:25

标签: java scala maven scala-maven-plugin

今天我一直试图找到一个合适的解决方案来设置一个包含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>

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

1 个答案:

答案 0 :(得分:9)

  • 是的,解决方案是“hacky”,但maven-compiler-plugin始终是第一个在编译阶段运行的插件(就像硬编码到maven中一样)。
  • 我没有使用scala 2.11进行测试,但是先前版本的scalac并没有将.java编译成.class(只解析它们)。和scala-maven-plugin一起运行,自2.7以来“每个版本的scala”。