Maven:在一个项目中混合 Java 和 Scala
Maven: mixing Java and Scala in one project
今天我一直在努力寻找一个合适的解决方案来设置一个包含 Java 和 Scala 代码(它们之间存在双向依赖关系)的 Maven 项目。
我发现的解决方案通常包括在 process-resources
阶段调用 scala-maven-plugin 或 maven-scala-plugin 以便它 运行s 在默认的 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).
这导致解决方案看起来像这样:
<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 代码,因此 .class 文件在 maven 编译器插件时已准备就绪运行s 在 compile
阶段。
问题是这个解决方案对我来说看起来不太干净。在编译阶段之前调用 Scala 编译过程只是为了确保它 运行s 在 maven 编译器插件似乎 "hacky" 之前。
Scala 编译器编译 Java classes 所以我想我可以完全关闭默认的 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 被制作成 运行 和 "every version of scala"。
今天我一直在努力寻找一个合适的解决方案来设置一个包含 Java 和 Scala 代码(它们之间存在双向依赖关系)的 Maven 项目。
我发现的解决方案通常包括在 process-resources
阶段调用 scala-maven-plugin 或 maven-scala-plugin 以便它 运行s 在默认的 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).
这导致解决方案看起来像这样:
<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 代码,因此 .class 文件在 maven 编译器插件时已准备就绪运行s 在 compile
阶段。
问题是这个解决方案对我来说看起来不太干净。在编译阶段之前调用 Scala 编译过程只是为了确保它 运行s 在 maven 编译器插件似乎 "hacky" 之前。
Scala 编译器编译 Java classes 所以我想我可以完全关闭默认的 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 被制作成 运行 和 "every version of scala"。