在Java项目中整合Scala

Scala是一个运行在Java JVM上的面向对象的语言。它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程。具有这些优势,使得我最近很想在一个新的项目中使用Scala,但是在新项目中,抛弃我们常用的Java和C#,而直接使用一门新的语言是很困难的。这不仅包括学习新语言这个过程,未来,更为项目的长期发展和日后的开发和支持增加了很多变数。毕竟一门新的语言是不可能在很短的时间内在行业中达到Java和C#的流行度的。

那么,我们就不能在新项目中应用和实践Scala么?通过我的实践,我发现其实我们可以通过简单的Maven配置把Scala集成到我们现有的Java项目中。这样我们可以很简单得在Java项目中集成和使用Scala。在这篇blog里,我给出一个用Scala实现的Hello World Servlet。项目的代码可以在https://github.com/mcai4gl2/scala-integration中找到。

在开发之前,我们首先要配置Scala环境。我在Java开发中使用IntelliJ,首先,在IntelliJ中安装Scala插件。插件安装好后,我们重启IntelliJ,这样我们的运行环境就配置好了。

我们用IntelliJ新建一个Maven项目,添加如下Maven Dependency:

<dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.10.1</version>
        </dependency>
同时添加如下plugin:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.8.1</version>
                <configuration>
                    <includes>
                        <include>**/*.java</include>
                        <include>**/*.scala</include>
                    </includes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

这样就完成了对我们的Java项目添加Scala的步骤。

在下面的Scala代码中,我们实现了一个简单的Servlet返回Hello World:

package weblog.examples.scala

import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.{RequestMapping, RequestMethod}
import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
import java.io.OutputStream
import org.apache.log4j.Logger
import org.apache.commons.io.IOUtils
import HelloWorldServlet._

@Controller
class HelloWorldServlet {
  @RequestMapping(value = Array("/"), method = Array(RequestMethod.GET))
  def helloworld(request: HttpServletRequest, response: HttpServletResponse, outputStream: OutputStream) {
    log.info("helloworld is called")
    response.setStatus(HttpServletResponse.SC_OK)
    IOUtils.write("HELLO WORLD!", outputStream)
    outputStream.flush
    outputStream.close
  }
}

object HelloWorldServlet {
  private var log: Logger = Logger.getLogger(classOf[HelloWorldServlet])
}

当这段代码通过编译之后,就会生成和Java一样的class文件。我们可以看到,用Scala编写的Servlet代码更加简洁,这可以大大提高我们的编程效率。

由于Scala语言普及度的局限,在项目中普及使用还是很有风险的。但是,在我们编写Unit Test的过程中,我们可以很好的使用Scala来提高我们的编程效率。下面是一个用Scala写的对我们的HelloWorldServlet进行测试的单元测试的例子:

package weblog.examples.scala

import org.springframework.web.servlet.DispatcherServlet
import org.springframework.mock.web.{MockServletConfig, MockHttpServletResponse, MockHttpServletRequest}
import org.junit.{Assert, Test, After, Before}

class HelloWorldServletTest {
  private var dispatcherServlet : DispatcherServlet = _
  private var httpRequest : MockHttpServletRequest = _
  private var httpResponse : MockHttpServletResponse = _

  @Before
  def before() {
    val config = new MockServletConfig
    config.addInitParameter("contextConfigLocation", "classpath:servlet-context.xml")
    dispatcherServlet = new DispatcherServlet
    dispatcherServlet.init(config)

    httpRequest = new MockHttpServletRequest
    httpResponse = new MockHttpServletResponse
  }

  @After
  def after() {
    dispatcherServlet = null
    httpRequest = null
    httpResponse = null
  }

  @Test
  def testHelloWord() {
    httpRequest.setMethod("GET")
    httpRequest.setRequestURI("/")

    dispatcherServlet.service(httpRequest, httpResponse)

    val response = httpResponse.getContentAsString

    Assert.assertEquals("HELLO WORLD!", response)
  }
}

这段代码,与Java相比较要简洁很多,这可以大大提高我们的编程效率。

与完全基于Scala开发相比,这种Java与Scala的混合开发方式有以下几个优势:

  1. 项目本身还是基于Java的,可以很好的使用现有的Java工具,包括CI继承,等
  2. 混合了Java和Scala,可以使程序员根据自己的需要在不同的情况下选择更合适的语言
  3. 在项目未来的持续维护上,我们不需要使用Scala的专门程序员,即使是完全没有Scala经验的Java程序员,也可以进行代码维护
同时我们还可以用这种混合开发方式,对现有的Java项目进行修改,而不是完全的重写。希望这种混合开发方式可以帮助希望使用Scala而又在工作中没有机会的朋友。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值