使用Maven构建和发布基于SpringBoot的Scala应用

使用 Maven 来构建 Scala 开发的 SpringBoot 项目,其实与使用 Maven 构建 Java 开发的 SpringBoot 项目很接近,差异的地方很少,主要有几个地方需要改动:

1)因为 Scala 语言需要使用自己的编译器(Compiler)进行编译,所以,我们需要在 Maven 构建过程中使用一个编译 Scala 代码的 Maven 插件。

Scala 项目在编译期间需要依赖 Scala 的 compiler 类库,所以,也需要将 org.scala-lang:scala-compiler 添加为 Maven 构建过程中使用的依赖。

2)Scala 应用运行期间需要依赖 org.scala-lang:scala-library,故此也同样需要加入到 Maven 项目依赖中。

首先通过 http://start.spring.io 构建 currency-webapi-with-scala“脚手架”项目(Scaffolding),默认选择生成 Maven 项目(Maven Project),初始的 pom.xml 大致如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.keevol.springboot.chapter5</groupId>
  7. <artifactId>currency-webapi-with-scala</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <name>currency-webapi-with-scala</name>
  11. <description>Demo project for Spring Boot and Scala with Maven </description>
  12. <parent>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-parent</artifactId>
  15. <version>1.3.1.RELEASE</version>
  16. <relativePath /> <!-- lookup parent from repository -->
  17. </parent>
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <java.version>1.8</java.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.keevol.springboot</groupId>
  29. <artifactId>currency-rates-service</artifactId>
  30. <version>1.0-SNAPSHOT</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. </plugin>
  44. </plugins>
  45. </build>
  46. </project>

现在,我们要向这个 pom.xml 中添加“佐料”,添加的原则就是前面所说的那样,一个是 Scala 编译期的依赖,一个是 Scala 运行期的依赖,添加完“佐料”的 pom.xml 如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.keevol.springboot.chapter5</groupId>
  7. <artifactId>currency-webapi-with-scala</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <name>currency-webapi-with-scala</name>
  11. <description>Demo project for Spring Boot</description>
  12. <parent>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-parent</artifactId>
  15. <version>1.3.1.RELEASE</version>
  16. <relativePath /> <!-- lookup parent from repository -->
  17. </parent>
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <java.version>1.8</java.version>
  21. <scala.version>2.11.7</scala.version>
  22. </properties>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.scala-lang</groupId>
  26. <artifactId>scala-library</artifactId>
  27. <version>${scala.version}</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.scala-lang</groupId>
  31. <artifactId>scala-compiler</artifactId>
  32. <version>${scala.version}</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-web</artifactId>
  37. </dependency>
  38. <dependency>
  39. <groupId>com.keevol.springboot</groupId>
  40. <artifactId>currency-rates-service</artifactId>
  41. <version>1.0-SNAPSHOT</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-test</artifactId>
  46. <scope>test</scope>
  47. </dependency>
  48. </dependencies>
  49. <build>
  50. <plugins>
  51. <plugin>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-maven-plugin</artifactId>
  54. </plugin>
  55. <plugin>
  56. <groupId>net.alchim31.maven</groupId>
  57. <artifactId>scala-maven-plugin</artifactId>
  58. <version>3.2.2</version>
  59. <executions>
  60. <execution>
  61. <id>compile-scala</id>
  62. <phase>compile</phase>
  63. <goals>
  64. <goal>add-source</goal>
  65. <goal>compile</goal>
  66. </goals>
  67. </execution>
  68. <execution>
  69. <id>test-compile-scala</id>
  70. <phase>test-compile</phase>
  71. <goals>
  72. <goal>add-source</goal>
  73. <goal>testCompile</goal>
  74. </goals>
  75. </execution>
  76. </executions>
  77. <configuration>
  78. <recompileMode>incremental</recompileMode>
  79. <scalaVersion>${scala.version}</scalaVersion>
  80. <args>
  81. <arg>-deprecation</arg>
  82. </args>
  83. <jvmArgs>
  84. <jvmArg>-Xms64m</jvmArg>
  85. <jvmArg>-Xmx1024m</jvmArg>
  86. </jvmArgs>
  87. </configuration>
  88. </plugin>
  89. </plugins>
  90. </build>
  91. </project>

其中,scala-maven-plugin 的各项自定义配置只是演示,大家可以根据实际情况进行相应配置项的调整,比如针对 Scala 编译器的输入参数,或者 jvmArgs 的配置。

按照约定,scala 代码一般都放在 src/main/scala 源代码目录下,既然 Maven 的构建描述符已准备好,下面我们就准备开始写 Scala 代码。

下面是 Web API 对应的 Controller 实现:

  1. // ScalaCurrencyRateQueryController.scala源码文件
  2. @RestController
  3. class ScalaCurrencyRateQueryController {
  4. @Autowired var currencyRateService:CurrencyRateService=_
  5. @RequestMapping(value=Array("/"),method=Array(RequestMethod.GET))
  6. def quote(symbol: String): WebApiResponse[ExchangeRate] = {
  7. val response: WebApiResponse[ExchangeRate] = new WebApiResponse [ExchangeRate]
  8. response.setCode(WebApiResponse.SUCCESS_CODE)
  9. response.setData(currencyRateService.quote(CurrencyPair.from(symbol)))
  10. response
  11. }
  12. }

不同于 Java 将实例代码和静态代码都纳入同一个结构体,Scala 将这两种结构剥离为各自独立的实体,所以,main 启动类现在放在了 ScalaCurrency-WebApiApplication 的 companion object 中。

现在,只要通过 mvn package,然后 java-jar currency-webapi-with-scala-0.0.1-SNAPSHOT.jar 就可以顺利启动这个 Scala 开发的 SpringBoot 微服务了。

使用 Maven 构建 Scala 的 SpringBoot 微服务项目不单单只是开发期间过渡很平滑,其最大的好处更在于,原来围绕 Maven 打造的 SpringBoot 微框架的各项支持依然有效,比如 spring-boot-maven-plugin。

而且,开发完的基于 Scala 的 SpringBoot 微服务可以无缝地衔接到我们自己的微服务交付链路中去(之前围绕着 Java 和 SpringBoot 打造的交付链路基础设施持续有效)。

一旦通过微服务的发布和部署平台交付完成,基于 Scala 的 SpringBoot 微服务可以享受基于 Java 的 SpringBoot 微服务同样的待遇,从服务注册和发现,到监控与运维,甚至安全防护。

由于篇幅有限,请点击下面链接进行阅读:

  • 简化基于Maven的Scala项目创建详解
  • 简化基于Scala的Web API开发
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧浩海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值