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

2022-09-02 10:49:21

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

我找到的解决方案通常包括在阶段调用scala-maven-plugin或maven-scala-plugin,以便它在默认的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)。process-resources

这导致解决方案如下所示:

<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编译器插件在阶段运行时,.class文件都准备就绪。process-resourcescompile

问题是这个解决方案对我来说并不干净。在编译阶段之前调用 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
  • 是的,解决方案是“黑客”的,但maven-compiler-plugin始终是第一个在编译阶段运行的插件(它就像硬编码成maven一样)。
  • 我没有用scala 2.11进行测试,但是以前版本的scalac不会.java编译成.class(只解析它们)。自2.7以来,scala-maven-plugin可以与“每个版本的scala”一起运行。

答案 2

推荐