当前位置: 首页 > 面试题库 >

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

容飞掣
2023-03-14
问题内容

今天,我一直在尝试寻找一个合适的解决方案来建立一个既包含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>

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


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


 类似资料:
  • 我和Gradle开始了一个多语言java/scala项目。java模块是使用JDK 1.6构建的遗留模块,因此我决定让我的构建环境使用旧的JDK。 这有一个非常实际的理由。代码如下: 使用JDK 1.6可以很好地编译,但使用JDK 1.7会中断,并出现以下错误: 出于这个原因(尽管很不幸),我决定坚持使用JDK 1.6(我们确实有这样的代码)。 现在我创建了一个全新的Gradle项目(之前没有使用

  • 问题内容: 要一起运行它们,几乎没有可用的选项,但是我选择为Junit和TestNG使用不同的配置文件。但是现在的问题是排除和包含测试用例。 由于如果我们在Maven的主项目中添加testNG依赖项,它将跳过所有Junit,因此我决定将其放在单独的配置文件中。所以我使用pom.xml中的以下条目从默认(主要)配置文件中排除了TestNG测试: 与surefire插件相同。因此,它可以与主配置文件配

  • 我试图编译一个MavenJava /Scala混合项目,它有一个Scala类,该类依赖于带有lombok注释的Javabean。我尝试将lombok jar文件添加到Scala编译器的引导类路径以及lombok代理中,但是编译器仍然无法找到生成的getters。Scala编译器是否有办法识别Lombok注释?如果没有,什么是好的解决方案? 请注意,我试图避免引入另一个maven项目,只是为了先编译

  • 问题内容: 按照以下两个最重要的答案:Maven依赖groovy。我正在尝试使用org.codehaus.gmaven的GMaven插件与Maven一起编译Java 6 + Groovy混合项目。直到昨天,我们仍在使用旧版本的Groovy(在最终使它工作后再也没有对其进行更改),但是由于现在稳定了,我认为我们应该切换到该版本。 如果只是这么简单。.我现在遇到的问题似乎有两个方面: 仍然以默认方式被

  • 我无法成功配置maven项目来运行Java和Kotlin混合JUnit4/JUnit5Jupiter测试。 我也在JUnit team GitHub issues和Kotlin slack Channel上发布了类似的问题:-https://GitHub.com/junit-team/junit5/issues/1899-https://kotlinlang.slack.com/archives/