【scala】使用gradle和scala构建springboot程序

零、版本说明:

springboot: 2.7.18

使用log4j2,不使用springboot自带的logback

scala版本:2.11

jackson版本:2.16.0

一、依赖:

groovy 复制代码
buildscript {
    dependencies {
        // using spring-boot-maven-plugin as package tool
        classpath("org.springframework.boot:spring-boot-maven-plugin:2.7.18")
    }
}
plugins {
    id 'idea'
    id 'scala'
    id 'org.springframework.boot' version '2.7.18'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
// 指定java版本
sourceCompatibility = 1.8
targetCompatibility = 1.8
// 尽量使用2.16.0版本的jackson对scala支持更好。
ext {
    jackson_version = '2.16.0'
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web") {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
    implementation("org.springframework.boot:spring-boot-starter-log4j2")
    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude group: 'org.junit.jupiter'
    }
    testImplementation 'io.projectreactor:reactor-test:3.4.29'
    implementation("com.fasterxml.jackson.core:jackson-core:${jackson_version}")
    implementation("com.fasterxml.jackson.core:jackson-annotations:${jackson_version}")
    implementation("com.fasterxml.jackson.core:jackson-databind:${jackson_version}")
    implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jackson_version}")
    implementation("com.fasterxml.jackson.module:jackson-module-scala_2.11:${jackson_version}")

    testImplementation "com.fasterxml.jackson.core:jackson-core:${jackson_version}"
    testImplementation("com.fasterxml.jackson.core:jackson-annotations:${jackson_version}")
    testImplementation("com.fasterxml.jackson.core:jackson-databind:${jackson_version}")
    testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jackson_version}")
    testImplementation("com.fasterxml.jackson.module:jackson-module-scala_2.11:${jackson_version}")
}
configurations {
    all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}

主启动类

此处也可以继承scala的App 但需要注意要重新App中的main方法。

scala 复制代码
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.{ SpringBootApplication}

@SpringBootApplication
class AppServe
object AppServer {
  private val log = org.slf4j.LoggerFactory.getLogger(classOf[AppServer])

  def main(args: Array[String]): Unit = {
    log.info(s"${getClass.getName} get args: ${args.toList.toString()}")
    SpringApplication.run(classOf[AppServer], args: _*)

  }
}

springboot序列化使用的是jackson,而自带的jackson版本较低,且不支持scala。

scala 复制代码
import com.fasterxml.jackson.databind.Module
import com.fasterxml.jackson.module.scala.{ClassTagExtensions, DefaultScalaModule}
import org.springframework.context.annotation.{Bean, Configuration}
import lombok.extern.slf4j.Slf4j

/**
 * https://blog.csdn.net/beibaozhou1656/article/details/100966023
 */
@Configuration
class JacksonConfiguration {
  @Bean
  def defaultScalaModule(): Module = {
     DefaultScalaModule::ClassTagExtensions
  }
}

controller类

注意:@Resource()@Autowire)使用方法。

scala 复制代码
import org.springframework.web.bind.annotation.{PostMapping, PutMapping, RequestBody, RequestMapping, RestController}
import lombok.extern.slf4j.Slf4j

@Slf4j
@RestController
@RequestMapping(Array("/v1"))
class BatchController @Resource()(batchService: BatchSaveService) {

  @PostMapping(Array("/batch/save"))
  def batchSave(@RequestBody tbls: java.util.List[Element]): Unit = {
    batchService.batch(tbls.asScala)
  }
}

配置文件值获取

application.properties,application.yml,application.yaml文件

scala 复制代码
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component
import javax.annotation.PostConstruct

@Slf4j
@Component
class KerberosEnvConfiguration() {
// 注意:要去除value=s"${}"的`s`。
  @Value(value = "${udf.kafka.consumer.krb5-conf}") var krb5Conf: String = _
  @PostConstruct
  def init(): Unit = {
 // 使用在post construct之后可以使用krb5Conf变量
 System.setProperty( ... )
  }
  def getConf():String={
  krb5Conf
}
}
scala 复制代码
import lombok.extern.slf4j.Slf4j
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.springframework.kafka.annotation.KafkaListener
import org.springframework.stereotype.{Component}
import javax.annotation.Resource

/**
 * kerberos整合kafka、springboot
 * https://blog.csdn.net/weixin_40496191/article/details/124056953
 * SpringBoot集成Kafka详解
 * https://blog.csdn.net/qq_20865839/article/details/13394898
 */
@Slf4j
@Component
class KafkaTableService @Resource()(service: CommonServiceImpl)  extends Logging {
  val mapper = JsonUtils.getMapper
// 可以使用#{}在注解中使用被@Component的的方法。
  @KafkaListener(topics = Array("#{kerberosEnvConfiguration.getConf()}"))
  def onMessage(record: ConsumerRecord[String, String]) = {
  // do nothing
  }
  
}

注意:

1、springboot打包必须使用spring-boot-maven-plugin,不能使用shadowJar

如下jar目录结构:

2、idea中debug
3、无需设置main-class,springboot的插件设置。

4、生产环境启动nohub java -jar xxx.jar 2>&1 &

参考文章:
<>

相关推荐
苹果醋32 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
Wx-bishekaifayuan2 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Yaml43 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
LuckyLay3 小时前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
佳佳_4 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
程序媛小果5 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
狂放不羁霸7 小时前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
计算机学长felix8 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
码农派大星。8 小时前
Spring Boot 配置文件
java·spring boot·后端