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

news2024/12/25 12:33:25

零、版本说明:

springboot: 2.7.18
使用log4j2,不使用springboot自带的logback
scala版本:2.11
jackson版本:2.16.0

一、依赖:

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方法。

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。

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)使用方法。

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文件

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

参考文章:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1543461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker实战指南:编辑Dockerfile、编译镜像、启动容器,一网打尽

万能dockerfile编写模板文件 FROM openjdk:11.0 as builder WORKDIR application ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmodelayertools -jar application.jar extractFROM openjdk:11.0 WORKDIR application COPY --frombuilder applica…

【浏览器渲染-输入Url到页面渲染全流程】

概述 在面试题中有一道经典面试题就是浏览器输入url之后发送了什么,看了下网上的大多数文章都感觉不太全,所以这里梳理了比较全的流程,如果有误,欢迎评论指正。本文大致是从以下内容概览入手,有需要的可以跳转到感兴趣…

【C语言】函数atoi的详解与实现~

一、atoi函数的讲解 函数声明&#xff1a;int atoi( const char *string );头 文 件 &#xff1a;<stdlib.h>函数功能&#xff1a;对指针string所指向的字符串&#xff0c;将其中的一段连续的(0~9)数字按照( int )返回&#xff1b;函数特点&#xff1a;&#xff08;这里…

ElasTool v3.0 程序:材料弹性和机械性能的高效计算和可视化工具包

分享一个材料弹性和机械性能的高效计算和可视化工具包&#xff1a; ElasTool v3.0。 感谢论文的原作者&#xff01; 主要内容 “弹性和机械性能的高效计算和可视化对于材料的选择和新材料的设计至关重要。该工具包标志着材料弹性和机械性能计算分析和可视化方面的重大进步…

C++语言学习(二)—— C++语言的基本知识

目录 一、面向对象的三个核心概念 二、C语言中的I/O口 三、C语言中的数据类型​​​​​​​ 3.1 逻辑类型 3.2 引用类型 3.2.1 引用作为函数参数 3.2.2 引用作为函数返回值 3.2.3 引用作为类成员 3.3 类类型 四、 C语言中的内联函数 五、 函数重载 六、 带默认形参…

【项目】均衡代码评测

TOC 目录 项目介绍 开发环境 主要技术 项目实现 公共模块 日志 工具类 编译运行模块 介绍 编译 运行 编译和运行结合起来 业务逻辑模块 介绍 MVC模式框架 模型&#xff08;Model&#xff09; 视图&#xff08;View) 控制器&#xff08;Controller&#xff09…

【包远程运行安装】SpringBoot+Mysql实现的在线音乐播放系统源码+运行教程+开发文档(参考论文)

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的千千在线音乐播放系统&#xff0c;主要实现了在线音乐的播放和下载&#xff08;支持付费和开通VIP功能&#xff09; 除脚手架功能以外下面是系统的功能&#xff1a; 前台普通用户&#xff1a;注册、登录…

Java笔记(一)基础、流程控制、数组、面向对象基础

堆&#xff08;Heap&#xff09; &#xff1a;此内存区域的唯一目的就是存放对象实例&#xff0c;几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是&#xff1a;所有的对象实例以及数组都要在堆上分配。栈&#xff08;Stack&#xff09; &#xff1a;是指…

住宅IP是什么?与机房IP有哪些区别?

随着互联网的普及和发展&#xff0c;不同类型的IP地址在网络世界中扮演着重要角色。在网络架构中&#xff0c;机房IP和住宅IP是两种常见的IP类型&#xff0c;它们各有优劣&#xff0c;适用于不同的场景和需求。本文将对机房IP和住宅IP进行技术对比&#xff0c;并给出选择合适IP…

视频汇聚平台EasyCVR启用图形验证码之后调用login接口的操作方法

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

2020-Structure Aware Negative Sampling in Knowledge Graphs

摘要 使用对比估计学习知识图中实体和关系的低维表示是一种可扩展且有效的推断连接模式的方法。对比学习方法的一个关键方面是选择产生硬负样本的腐败分布&#xff0c;这迫使嵌入模型学习判别表示并找到观察数据的关键特征。虽然早期的方法要么采用过于简单的腐败分布&#xf…

机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】

目录 前言 一、什么是线性回归 二、什么是逻辑回归 三、基于Python 和 Scikit-learn 库实现线性回归 示例代码&#xff1a; 使用线性回归来预测房价: 四、基于Python 和 Scikit-learn 库实现逻辑回归 五、总结 线性回归的优缺点总结&#xff1a; 逻辑回归&#xff08;Logistic…

使用zabbix自动发现规则监控oracle分区表的分区键的合法

一、 创建从数据库查询原始数据脚本 编写脚本query_table.sh vim query_table.sh #!/bin/bash temp_outfile"/tmp/table.source" outfile"/tmp/table.txt" source /home/oracle/.bash_profilesqlplus -s zabbix/zabbix>${temp_outfile}<<EOF c…

Hive SQL必刷练习题:留存率问题(*****)

留存率&#xff1a; 首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总…

Redis入门到实战-第十一弹

Redis实战热身Bitmaps篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理和…

Spring boot2.7整合jetcache方法缓存 设置定时刷新 解决多系统同时操作数据问题

上文 Spring boot2.7整合jetcache方法缓存 处理数据发生变化时同步更新缓存 删除缓存操作 解决了 缓存更新的问题 但是 现在有个问题 例如 我们 A系统 和 B系统 同时缓存了这一组数据 但是 A系统数据发生了更新 但是 B系统并不知道 其实 也没有特别好的办法同步通知 但可以控…

复旦大学EMBA肖仰华:人类文明或许将因为AI迎来一段“盘整期”

“君子知道”复旦大学EMBA前沿论坛上&#xff0c;复旦大学计算机学院肖仰华教授曾为企业家同学进行过主题分享。他认为&#xff0c;Sora只是开始&#xff0c;AI或让人类文明进入“盘整期”。      在人工智能的浩瀚世界中&#xff0c;Sora也只是冰山一角。当AI技术“高歌猛…

网约车APP小程序源码代驾顺风拼车货运司乘端安卓苹果源码可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的&#xff0c;全开源未加密&#xff0c;这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍&#xff1a; 车主实名认证&#xff0c;驾驶证认证&#xff0c;车…

Pycharm服务器配置python解释器并结合内网穿透实现公网远程开发

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络——套接字编程UDP

目录 端口号 源端口号和目的端口号 认识TCP协议和UDP协议 网络字节序 socket编程接口 socket常见接口 sockaddr结构 UDP socket bind recvfrom sendto 编写客户端 绑定INADDR_ANY 实现聊天功能 端口号 在这之前我们已经说过源IP地址和目的IP地址&#xff0c;还有…