【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 &

参考文章:
<>

相关推荐
昵称为空C13 小时前
SpringBoot3 http接口调用新方式RestClient + @HttpExchange像使用Feign一样调用
spring boot·后端
麦兜*1 天前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
麦兜*1 天前
MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
java·数据库·spring boot·物联网·mongodb·spring
汤姆yu1 天前
基于springboot的毕业旅游一站式定制系统
spring boot·后端·旅游
计算机毕业设计木哥1 天前
计算机毕设选题推荐:基于Java+SpringBoot物品租赁管理系统【源码+文档+调试】
java·vue.js·spring boot·mysql·spark·毕业设计·课程设计
hdsoft_huge1 天前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
AD钙奶-lalala1 天前
SpringBoot实现WebSocket服务端
spring boot·后端·websocket
毕设源码-朱学姐2 天前
【开题答辩全过程】以 4S店汽车维修保养管理系统为例,包含答辩的问题和答案
java·spring boot·汽车
BXCQ_xuan2 天前
软件工程实践二:Spring Boot 知识回顾
java·spring boot·后端
wuxuanok2 天前
SpringBoot -原理篇
java·spring boot·spring