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

时间:2013-12-05 09:41:01

标签: java scala maven servlets scala-collections

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

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

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

4 个答案:

答案 0 :(得分:18)

我现在正在处理一个混合的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的JavaConversionsJavaConverters对象。

对于构建,我们使用Ant(我个人更喜欢SBT用于新项目,但是如果你正在处理一个使用ant的预先存在的java项目,那么改变构建可能会比它的价值更麻烦。系统)。要配置ant以编译scala文件,请查看this question

答案 1 :(得分:8)

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

Mixed Java/Scala Projects页面应该可以让你前进,不过还有其他有趣的文档页面。只需添加此处显示的相关部分,然后尝试编译您的项目。不要犯下我做的错误并尝试使用其他配置首先记录在其他配置中:只需在顶级pom.xml中执行这些最小配置更改(或者如果Scala在项目中的范围有限,则无论如何都有意义) 。转到here可以更轻松地复制&粘贴文本(没有'+'显示添加内容。)

Kelime _kelimecim = _rk.All().Where(w => !kelimeIdler.Contains(w.ID)).FirstOrDefault();

如果您使用的是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兼容,但是不一定是彼此。我不知道细节,但无论如何这都与这个问题有点相关。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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