有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我发现的解决方案通常包括在process-resources阶段调用scala maven插件或maven scala插件,使其在默认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的官方插件页面: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阶段运行时,类文件都准备好了

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

  1. # 1 楼答案

    • 是的,解决方案是“hacky”,但maven编译器插件始终是在编译阶段运行的第一个插件(就像硬编码到maven中)
    • 我没有使用scala 2.11进行测试,但scalac的早期版本无法编译。java进入。类(仅解析它们)。scala maven插件从2.7版开始就可以与“scala的每个版本”一起运行