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

将Scala集成到Java中的现有项目中,java,scala,maven,servlets,scala-collections,Java,Scala,Maven,Servlets,Scala Collections,我们有一个用Java编写的项目。这是一个maven项目,包含jsp页面和大量java代码: 用于处理用户请求和响应的servlet servlet用来处理所需逻辑的逻辑类 用于连接到数据库并执行逻辑所需的特定查询的SQL生成器类 嗯,我们正在寻找斯卡拉。例如,我们使用映射器从数据库中获取一个实体集合,然后转换这个集合,过滤它并返回servlet。在Java中,这似乎是一件好事。问题是-如何将其集成到现有项目中?我可以在用Java编写的逻辑文件中使用一些Scala类,这些类再次使用用Java编

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

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

嗯,我们正在寻找斯卡拉。例如,我们使用映射器从数据库中获取一个实体集合,然后转换这个集合,过滤它并返回servlet。在Java中,这似乎是一件好事。问题是-如何将其集成到现有项目中?我可以在用Java编写的逻辑文件中使用一些Scala类,这些类再次使用用Java编写的映射器文件吗

是的,Java和Scala之间可以毫无问题地相互依赖

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

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

这两种语言的互操作性相当好,不过就集合而言,您可能想看看Scala和对象


对于构建,我们使用Ant(我个人更喜欢新项目使用SBT,但如果您处理的是使用Ant的现有java项目,那么更改构建系统可能会带来更多麻烦)。要将ant配置为编译scala文件,请看一下。

这是一种将scala代码集成到Maven构建中的好方法,尽管我还没有尝试过。(我使用SBT,它可以很好地实现Scala/Java集成,还可以通过插件创建IDE项目(Idea和Eclipse)。不过,你不想改变整个构建过程)。

我发现没有人提到@richard close的回答中提到的,以前是maven Scala插件。我在这方面没有丰富的经验,但我已经在两个Java项目(一个相当大,一个很小)上取得了立竿见影的成功,所以我觉得在这里发布这篇文章是值得的——尽管这个问题现在有点过时了——因为我是通过谷歌提出这个问题的

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


+       
+org.scala-lang
+scala图书馆
+        2.11.7
+      
+        
+net.alchim31.maven
+scala maven插件
+          3.2.1
+        
+        
+org.apache.maven.plugins
+maven编译器插件
+          2.0.2
+        
+       
+net.alchim31.maven
+scala maven插件
+        
+          
+scala先编译
+过程资源
+            
+添加源
+编撰
+            
+          
+          
+scala测试编译
+过程测试资源
+            
+测试编译
+            
+          
+        
+      
+      
+org.apache.maven.plugins
+maven编译器插件
+        
+          
+编撰
+            
+编撰
+            
+          
+        
+      
如果您使用的是Java 8(即Scala 2.11.x),请确保使用上述Scala的更新版本;一些官方文件可能有点过时

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

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

警告 @jamesadam关于javaconversion的评论也非常重要。
在一个项目中尝试将Scala与另一种JVM语言(Kotlin)集成时,我意识到的一个问题是,由于每种语言处理集合的方式,事情可能没有那么顺利:它们都设计为与Java很好地协同工作,但不一定彼此协同工作。我不知道细节,但这与问题有点不相干。

你能再具体一点吗?也许可以举个例子?Java如何从Scala中导入类?与从Java中导入类完全相同。如果您遇到一些问题,请检查IDE中的编译顺序设置,确保它没有单独编译Java和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>