小编典典

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

java

今天,我一直在尝试寻找一个合适的解决方案来建立一个既包含Java代码又包含Scala代码(它们之间具有双向依赖性)的maven项目。

我发现的解决方案通常包括在该process-resources阶段调用scala-maven-plugin或maven-scala-
plugin,以便它在默认的maven编译器插件之前运行(示例:http : //www.hascode.com/2012/03 /片段混合-
斯卡拉的Java-IN-A-Maven的项目/,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编译在process- resources阶段中被调用,并且编译Java和Scala代码,因此当maven编译器插件在compile阶段中运行时,.class文件都准备就绪。

问题是这种解决方案对我来说看起来并不干净。在编译阶段之前调用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>

我想知道为什么此解决方案不是博客文章或官方插件页面中建议的解决方案。这种方法有不利之处吗?使用第二种解决方案而不是第一种解决方案时,我应该遇到什么问题吗?


阅读 211

收藏
2020-11-01

共1个答案

小编典典

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