将 Scala 集成到 Java 中的现有项目中

2022-09-01 18:58:58

我们有一个用Java编写的项目。这是一个maven项目,有jsp页面和大量的java代码:

  • 用于处理用户请求和处理响应的 servlet。
  • servlets 用于处理所需逻辑的逻辑类。
  • 用于连接到数据库并执行逻辑所需的特定查询的 SQL 生成器的类。

好吧,我们正在看Scala。例如,我们使用映射器从数据库中获取实体的集合,然后转换此集合,对其进行筛选并返回到 servlet。这在Java中似乎是一件好事。问题是 - 我如何将其集成到现有项目中?我可以在用Java编写的逻辑文件中使用一些Scala类,这些类再次使用用Java编写的映射器文件吗?


答案 1

我现在从事一个混合的Java/Scala项目(以前是一个仅限Java的项目)。请记住,就JVM而言,从javac生成的.class文件与从scalac生成的文件之间没有区别。

例如:我在Scala中实现了Java接口并扩展了Java类,没有任何问题。我还在同一个定义文件中将Java bean和'Scala'spring bean实例化在一起(scala bean依赖于java bean,反之亦然),并且我有Java和Scala beans在Spring集成消息传递管道中共存。

这两种语言的互操作性非常好,尽管在集合方面,你可能想看看Scala的JavaConversionsJavaConverters对象。

对于构建,我们使用Ant(我个人更喜欢SBT用于新项目,但是如果您正在处理使用ant的预先存在的java项目,那么更改构建系统可能会比值得更麻烦)。要配置 ant 来编译 scala 文件,请看一下这个问题


答案 2

我看到没有人提到David Bernardscala-maven-plugin,以前是maven-scala-plugin,在@richard-close的答案中提到过。我没有丰富的经验,但我在两个Java项目(一个相当大的,一个小的)上取得了立竿见影的成功,所以我认为值得在这里发布这个 - 即使这个问题现在有点过时了 - 因为我通过Google找到了这个问题。

混合Java/Scala项目页面应该能够让你继续前进,尽管还有其他有趣的文档页面。只需添加此处显示的相关部分,然后尝试编译您的项目。不要犯我犯的错误,并尝试首先使用其他地方记录的其他配置:只需遵循顶级pom中的这些最小配置更改.xml(或者如果Scala在您的项目中范围有限,则进行任何有意义的更改)。转到此处以获取更易于复制和粘贴的文本(没有“+”显示添加的内容)。

<dependencies>
+       <dependency>
+        <groupId>org.scala-lang</groupId>
+        <artifactId>scala-library</artifactId>
+        <version>2.11.7</version>
+      </dependency>
</dependencies>
<build>
 <pluginManagement>
  <plugins>
+        <plugin>
+          <groupId>net.alchim31.maven</groupId>
+          <artifactId>scala-maven-plugin</artifactId>
+          <version>3.2.1</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>2.0.2</version>
+        </plugin>
  </plugins>
 </pluginManagement>
 <plugins>
+       <plugin>
+        <groupId>net.alchim31.maven</groupId>
+        <artifactId>scala-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>scala-compile-first</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>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>compile</phase>
+            <goals>
+              <goal>compile</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
 </plugins>
</build>

如果您使用的是Java 8(即Scala 2.11.x),请确保使用上述Scala的更新版本;一些官方文档可能会稍微模糊。

我注意到文档说你需要做但显然不需要做的一件事:你不需要把你的Scala源代码放在一个单独的目录中,并且可以将它们留在项目的现有java目录下。这很方便,似乎有效,但我不知道是否有副作用。

IntelliJ notes

如果您碰巧使用IntelliJ,请不要忘记右键单击项目视图中的maven模块并“添加框架支持...”将 Scala 框架添加到项目中。如果您使用的是多模块项目,而不仅仅是顶级模块,则可能需要将框架添加到打算使用 Scala 的每个子模块中。然后,您应该能够自动将Java文件转换为Scala文件,可以通过重构菜单访问(尽管您需要进行一些手动修复)。这可以为您提供一种快速测试配置的方法,特别是如果您可以先尝试一些小的Java类。

警告

@james-adam关于JavaConversions的评论也非常重要。在尝试在单个项目中将 Scala 与另一种 JVM 语言(Kotlin)集成时,我意识到的一个问题是,由于每种语言处理集合的方式,事情可能并不那么顺利:它们都被设计为与 Java 很好地配合使用,但不一定彼此兼容。我不知道细节,但无论如何,这与问题有点无关。


推荐