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

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

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

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

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

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

这两种语言互操作性很好,但在涉及集合的情况下,您可能希望了解Scala的JavaConversions和JavaConverters对象。

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

我看到没有人提到David Bernard的scala-maven-plugin ,以前是maven-scala-plugin,在@ richard-close的回答中提到过。 我没有丰富的经验,但我已经立即成功完成了两个Java项目(一个相当大,一个小),所以我觉得值得在这里发布 – 尽管这个问题现在已经过时了 – 因为我通过谷歌来到这个问题。

尽管还有其他有趣的文档页面,但混合Java / Scala项目页面应该可以帮助您。 只需添加此处显示的相关部分,然后尝试编译您的项目。 不要犯下我做的错误并尝试使用其他配置首先记录在其他配置中:只需在顶层pom.xml中遵循这些最小配置更改(或者如果Scala在您的项目中具有有限的范围,则无论如何都有意义) 。 转到此处可以更轻松地复制和粘贴文本(没有’+’显示添加内容)。

 +  + org.scala-lang + scala-library + 2.11.7 +      +  + net.alchim31.maven + scala-maven-plugin + 3.2.1 +  +  + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 +     +  + net.alchim31.maven + scala-maven-plugin +  +  + scala-compile-first + process-resources +  + add-source + compile +  +  +  + scala-test-compile + process-test-resources +  + testCompile +  +  +  +  +  + org.apache.maven.plugins + maven-compiler-plugin +  +  + compile +  + compile +  +  +  +    

如果您使用的是Java 8(即Scala 2.11.x),请务必使用上面的Scala更新版本; 一些官方文档可能会稍微调整一下。

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

IntelliJ笔记

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

注意事项

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

这个: http : //scala-tools.org/mvnsites/maven-scala-plugin看起来是将Scala代码集成到Maven构建中的好方法,尽管我还没有尝试过。 (我使用SBT,它可以很好地完成Scala / Java集成,以及通过插件创建IDE项目(Idea和Eclipse)。但是,您不希望改变整个构建过程)。

是的,您可以在Java和Scala之间存在相互依赖性而不会出现问题。