最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

KotlinScript構(gòu)建SpringBootStarter保姆級(jí)教程

2022-09-27 20:22 作者:技術(shù)之心  | 我要投稿

引言

因業(yè)務(wù)需要, 公司內(nèi)需要使用 SpringBoot Starter 構(gòu)建 SDK. 不同的是使用了更為靈活的 Kotlin 語言, 構(gòu)建腳本也換成了 Kotlin Script.

  • 框架: SpringBoot

  • 業(yè)務(wù)代碼語言: Kotlin

  • 構(gòu)建工具: Gradle

  • 構(gòu)建腳本: Kotlin Script (不同于 Groovy, 是 Kotlin 自家的 DSL, 文件后綴為?.kts)

  • 開發(fā)工具: Idea CE

本文主要分幾個(gè)步驟:

  • 用 Kotlin 寫一個(gè)簡(jiǎn)單 SpringBoot Starter

  • 進(jìn)階一: 復(fù)雜配置參數(shù)的寫法

  • 進(jìn)階二: starter 單元測(cè)試

  • 使用 Kotlin Script 構(gòu)建成 Maven 依賴

  • 集成測(cè)試

不會(huì)太詳細(xì), 但會(huì)把主要的內(nèi)容和要注意的點(diǎn)記錄下來.

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%BC%80%E6%88%B7【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%BC%80%E6%88%B7%E7%BD%91%E5%9D%80【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%AE%A2%E6%9C%8D【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%9C%A8%E7%BA%BF%E5%AE%A2%E6%9C%8D%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%9C%A8%E7%BA%BF%E5%AE%A2%E6%9C%8D%E5%BE%AE%E4%BF%A1【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%94%B5%E8%AF%9D%E5%A4%9A%E5%B0%91【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%94%B5%E8%AF%9D%E5%BE%AE【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%AE%A2%E6%9C%8D%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%AE%A2%E6%9C%8D%E7%BD%91%E5%9D%80【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%94%B5%E8%AF%9D【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%8E%B0%E5%9C%BA%E5%BC%80%E6%88%B7%E5%AE%A2%E6%9C%8D【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%8E%B0%E5%9C%BA%E5%BC%80%E6%88%B7%E7%BB%8F%E7%90%86【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%8E%B0%E5%9C%BA%E7%BB%8F%E7%90%86%E7%94%B5%E8%AF%9D【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E4%B8%8A%E4%B8%8B%E5%88%86%E5%AE%A2%E6%9C%8D%E7%94%B5%E8%AF%9D【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E4%B8%8A%E4%B8%8B%E5%88%86%E5%AE%A2%E6%9C%8DQQ【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E4%B8%8A%E4%B8%8B%E5%88%86%E7%94%B5%E8%AF%9D【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E4%B8%8A%E4%B8%8B%E5%88%86%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E6%98%AF%E5%81%9A%E4%BB%80%E4%B9%88%E7%9A%84【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%B9%B3%E5%8F%B0%E6%AD%A3%E8%A7%84%E5%90%97%3F【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%AE%A2%E6%9C%8D%E5%BE%AE%E4%BF%A1%E5%A4%9A%E5%B0%91【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E8%81%94%E7%B3%BB%E5%BE%AE%E4%BF%A1【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E4%BB%A3%E7%90%86【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%82%B9%E5%87%BB%E6%B3%A8%E5%86%8C【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%9C%A8%E7%BA%BF%E8%81%94%E7%B3%BB%E5%BE%AE%E4%BF%A1【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%9C%A8%E7%BA%BF%E5%BE%AE%E4%BF%A1【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8APP%E4%B8%8B%E8%BD%BD【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%BD%91%E5%9D%80【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%8E%B0%E5%9C%BA%E5%AE%A2%E6%9C%8D%E7%94%B5%E8%AF%9D【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%8E%B0%E5%9C%BA【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%AE%98%E7%BD%91【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%BB%8F%E7%90%86【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F%E6%98%AF%E5%A4%9A%E5%B0%91【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E8%81%94%E7%B3%BB%E5%AE%98%E7%BD%91【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E8%81%94%E7%B3%BB%E7%94%B5%E8%AF%9D%E5%BE%AE%E4%BF%A1【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E8%81%94%E7%B3%BB%E7%94%B5%E5%BE%AE%E4%BF%A1【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E4%BB%98%E6%AC%BE【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%AE%A2%E6%9C%8D%E5%BE%AE%E4%BF%A1【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%BD%91%E5%9D%80【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E8%80%81%E8%A1%97%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E5%AE%98%E7%BD%91【1848834O297】

http://iias.tsinghua.edu.cn/?s=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8app%E4%B8%8B%E8%BD%BD【1848834O297】

一 如何用 Kotlin 寫一個(gè)簡(jiǎn)單 SpringBoot Starter

1 分析

SpringBoot Starter 實(shí)現(xiàn)的原理網(wǎng)絡(luò)上已經(jīng)有很多, 就不細(xì)說了, 我總結(jié)了一下核心的運(yùn)作邏輯, 就是下面我畫的這張圖:

所以要寫一個(gè) starter, 無論用什么語言本質(zhì)上都是一樣的.

以下步驟可能與部分網(wǎng)絡(luò)教程不太一樣, 主要是根據(jù)上面的圖方向來分析說明的, 是一個(gè)按照邏輯需求來定義的順序:

  • 在?resources?下新建?META-INF?文件夾, 寫個(gè)?spring.factories?文件 (文件內(nèi)容見后文), 用于指定一個(gè)配置類.

  • 寫配置類, 主要職能是業(yè)務(wù) Bean 與 其相關(guān)配置的樞紐, 它將對(duì)業(yè)務(wù) Bean 進(jìn)行配置, 配置的內(nèi)容來源于后面我們自己定義的配置文件寫法.

  • 寫業(yè)務(wù) Bean, 也就是想讓別人引用這個(gè) starter 依賴后可以使用的類.

  • 寫配置屬性聲明類, 是個(gè) POJO 類, 聲明了可以在?application.properties?或者?application.yml?里能使用的配置屬性

  • 可選, 寫一個(gè) json 文件用于給使用者寫?application.properties?的時(shí)候提示一些信息

實(shí)際寫代碼時(shí)順序按需即可.

2 簡(jiǎn)單案例設(shè)計(jì)

比如, 我想實(shí)現(xiàn)一個(gè)郵件告警的 SDK.

這個(gè) SDK 有一個(gè)類?AlarmByEmails, 集成此 SDK 的項(xiàng)目通過如下的 application.properties 配置后, 可通過?AlarmByEmails?的某個(gè)方法調(diào)用 xxx@163.com 發(fā)送郵件給 yyy@163.com.

(考慮到后續(xù) starter 測(cè)試用 yml 方式有所不便, 所以 starter 中測(cè)試使用 properties 文件)


simple.alarm.email.host=smtp.163.com # 郵件協(xié)議服務(wù)器
simple.alarm.email.senderEmail=xxx@163.com? # 發(fā)送方郵箱
simple.alarm.email.senderPassword=xxx?? # 發(fā)送方郵箱的授權(quán)碼, 非密碼
simple.alarm.email.receiverEmail=yyy@163.com??? # 接收方郵箱

怎么實(shí)現(xiàn)呢?

3 代碼實(shí)現(xiàn)

看個(gè)總體目錄結(jié)構(gòu)(已刪減無關(guān)文件):


├── build.gradle.kts
├── settings.gradle.kts
└── src
????└── main
????????├── kotlin
????????│?? └── com
????????│?????? └── looko
????????│?????????? └── simplealarmspringbootstarter
????????│?????????????? ├── autoconfigure
????????│?????????????? │?? ├── SimpleAlarmAutoConfiguration.kt
????????│?????????????? │?? └── properties
????????│?????????????? │?????? └── EmailProperties.kt
????????│?????????????? └── component
????????│?????????????????? └── AlarmByEmails.kt
????????└── resources
????????????├── META-INF
????????????│?? └── spring.factories
????????????└── test.properties

依賴項(xiàng)

基于 Kotlin 和 Gradle 新建 Spring Boot 項(xiàng)目, 名稱最好按照 Starter 創(chuàng)建的約定俗成規(guī)范?xxx-spring-boot-starter?, 刪除啟動(dòng)類, 然后在?build.gradle.kts?的依賴中添加:

annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")

配置屬性聲明類: xxxProperties

這里的屬性就定義了配置文件的寫法.


@ConfigurationProperties(prefix = "simple.alarm.email")
data class EmailProperties(
??var host? = null,
??var senderEmail? = null,
??var senderPassword? = null,
??var receiverEmail? = null
)

注意:

  • 配置文件到 POJO 的屬性裝配是要用到 setter 的, 所以要定義為 var, 如果定義為 val , starter 被引用后, 程序啟動(dòng)階段在讀取相應(yīng)配置時(shí), 如果文件配置與默認(rèn)配置不一樣的話會(huì)報(bào)錯(cuò).

  • Spring 在處理這個(gè)類的時(shí)候會(huì)自動(dòng)屬性注入, 如果不寫缺省值的話啟動(dòng)找不到注入值會(huì)報(bào)錯(cuò).

業(yè)務(wù) Bean

屬性聲明好了, 該到用的時(shí)候了.


class AlarmByEmail(
??private val host,
??private val senderEmail,
??private val senderPassword,
??private val receiverEmail
) {
??fun sendMessage(content: String): Boolean {
????// 發(fā)郵件的實(shí)現(xiàn)
??}
}

此處使用了構(gòu)造器注入的方式, 也可以使用 setter 方式.

配置類: xxxAutoConfiguration

這是關(guān)鍵, 上面配置上的屬性和業(yè)務(wù) Bean 都有了, 如何把它倆關(guān)聯(lián)起來并注冊(cè)成 Spring Bean 呢?


@Configuration
@ConditionalOnClass(SimpleAlarmAutoConfiguration::class)
@EnableConfigurationProperties(value = [EmailProperties::class])
class SimpleAlarmAutoConfiguration {
????@Bean
????fun alarmByEmail(properties: EmailProperties): AlarmByEmail {
????????return AlarmByEmail(
??????????properties.host,
??????????properties.senderEmail,
??????????properties.senderPassword,
??????????properties.receiverEmail
????????)
????}
}

就是如此簡(jiǎn)單.

@Configuration + @Bean 老組合了, 將一個(gè)類注冊(cè)為 Spring Bean.

@ConditionalOnClass, 是基于 @Conditional 的條件注解, 是 Spring4 提供的一種注解, 它的作用是按照設(shè)定的條件進(jìn)行判斷, 把滿足判斷條件的 Bean 注冊(cè)到 Spring 容器. 相關(guān)注解如下:

條件注解作用@ConditionalOnBean當(dāng)上下文存在某個(gè)對(duì)象時(shí)才會(huì)實(shí)例化 Bean@ConditionalOnClass某個(gè) Class 位于 classpath 路徑上才會(huì)實(shí)例化 Bean@ConditionalOnExpression當(dāng) SpEL 表達(dá)式值為 true 的時(shí)候才會(huì)實(shí)例化 Bean@ConditionalOnMissingBean當(dāng)上下文不存在某個(gè)對(duì)象時(shí)才會(huì)實(shí)例化 Bean@ConditionalOnMissingClass某個(gè) Class 不在 classpath 路徑上才會(huì)實(shí)例化 Bean@ConditionalOnNotWebApplication非 web 應(yīng)用才會(huì)實(shí)例化 Bean@ConditionalOnWebApplicationweb 應(yīng)用才會(huì)實(shí)例化 Bean@ConditionalOnProperty當(dāng)指定的屬性有指定的值時(shí)才會(huì)實(shí)例化 Bean@ConditionalOnJava當(dāng) JVM 版本為指定的版本范圍時(shí)才會(huì)實(shí)例化 Bean@ConditionalOnResource當(dāng) classpath 路徑下有指定的資源時(shí)才會(huì)實(shí)例化 Bean@ConditionalOnJndi在 JNDI 存在時(shí)才會(huì)實(shí)例化 Bean@ConditionalOnSingleCandidate當(dāng)指定的 Bean 在容器中只有一個(gè), 或者有多個(gè)但是指定了首選的 Bean 時(shí), 才會(huì)實(shí)例化 Bean

@EnableConfigurationProperties , 用于獲取配置聲明類, 原理不贅述.

spring.factories 文件

這個(gè)文件是上面寫好的自動(dòng)配置的入口, 有了它 Spring 才能讀到上面寫好的內(nèi)容:


org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
??com.looko.simplealarmspringbootstarter.autoconfigure.SimpleAlarmAutoConfiguration

json 配置注釋文件

可不寫, 用來作為寫屬性時(shí)的提示.

spring-configuration-metadata.json?:


{
??"properties": [
????{
??????"name": "simple.alarm.email.host",
??????"type": "java.lang.String",
??????"description": "郵件服務(wù)器地址."
????},
????{
??????"name": "simple.alarm.email.senderEmail",
??????"type": "java.lang.String",
??????"description": "發(fā)送者郵箱."
????},
????{
??????"name": "simple.alarm.email.senderPassword",
??????"type": "java.lang.String",
??????"description": "發(fā)送者授權(quán)碼."
????},
????{
??????"name": "simple.alarm.email.receiverEmail",
??????"type": "java.lang.String",
??????"description": "接收者郵箱."
????},
??]
}

二 進(jìn)階: 復(fù)雜配置參數(shù)的寫法

如果我想通過配置配多個(gè)發(fā)送者的郵箱, 每個(gè)郵箱又可以配置, 該如何實(shí)現(xiàn)呢?

比如, 使用 xxx@163.com 發(fā)送郵件給 yyy@163.com, 而使用 yyy@163.com 則可以同時(shí)發(fā)郵件給 zzz@163.com 和 xxx@163.com.

配置的寫法:


simple.alarm.email.configs[0].host=smtp.163.com
simple.alarm.email.configs[0].senderEmail=xxx@163.com
simple.alarm.email.configs[0].senderPassword=xxx
simple.alarm.email.configs[0].receivers[0]=yyy@163.com
simple.alarm.email.configs[1].host=smtp.163.com
simple.alarm.email.configs[1].senderEmail=yyy@163.com
simple.alarm.email.configs[1].senderPassword=yyy
simple.alarm.email.configs[1].receivers[0]=zzz@163.com
simple.alarm.email.configs[1].receivers[0]=xxx@163.com

將郵箱按發(fā)送者分成了一個(gè)個(gè)的 configs 數(shù)組, 每個(gè) configs 下面保存了發(fā)送的配置, 同時(shí)接收者也配置成了數(shù)組,

這樣就完美符合需求了.

那么 properties 等類怎么寫呢?

EmailProperties:


@ConfigurationProperties(prefix = "simple.alarm.email")
data class EmailProperties(
????var configs: Array<EmailConfigEntity> = arrayOf()
)

這是抽出來的?EmailConfigEntity, 注意用 var:


data class EmailConfigEntity(
????var host: String? = null,
????var senderEmail: String? = null,
????var senderPassword: String? = null,
????var receivers: Array<String> = arrayOf()
)

因?yàn)閰?shù)抽出來了, 所以?AlarmByEmail?的入?yún)⒁惨鄳?yīng)調(diào)整:


class AlarmByEmail(
??private val configs: Array<EmailConfigEntity>
) {
??fun sendMessage(content: String): Boolean {
????// 發(fā)郵件的實(shí)現(xiàn)
??}
}

SimpleAlarmAutoConfiguration?相應(yīng)調(diào)整:


@Configuration
@ConditionalOnClass(SimpleAlarmAutoConfiguration::class)
@EnableConfigurationProperties(value = [EmailProperties::class])
class SimpleAlarmAutoConfiguration {
????@Bean
????fun alarmByEmail(properties: EmailProperties): AlarmByEmail {
????????return AlarmByEmail(
??????????properties.configs
????????)
????}
}

這樣就全部完成了.

三 進(jìn)階: Starter 單元測(cè)試

測(cè)試是必要的.

單獨(dú)的?Spring-boot-starter?并不是一個(gè)完整的應(yīng)用 大多數(shù)時(shí)候都是作為一個(gè)實(shí)際應(yīng)用的一部分存在 如果是通過另一個(gè)項(xiàng)目引用并啟動(dòng)項(xiàng)目的話, 會(huì)在 Debug 時(shí)造成不必要的麻煩 所以需要?jiǎng)?chuàng)建能夠獨(dú)立運(yùn)行的 Test

依賴


testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.boot:spring-boot-test-autoconfigure")

配置文件

resourses?路徑下的?test.properties:


simple.alarm.email.configs[0].host=smtp.163.com
simple.alarm.email.configs[0].senderEmail=xxx@163.com
simple.alarm.email.configs[0].senderPassword=xxx
simple.alarm.email.configs[0].receivers[0]=yyy@163.com
simple.alarm.email.configs[1].host=smtp.163.com
simple.alarm.email.configs[1].senderEmail=yyy@163.com
simple.alarm.email.configs[1].senderPassword=yyy
simple.alarm.email.configs[1].receivers[0]=zzz@163.com
simple.alarm.email.configs[1].receivers[0]=xxx@163.com

測(cè)試類

如下, 通過注解指定自動(dòng)配置類和配置文件


@SpringBootTest(classes = [SimpleAlarmAutoConfiguration::class])
@TestPropertySource("classpath:test.properties")
class SimpleAlarmSpringBootStarterApplicationTests {
????@Test
????fun contextLoads() {
????}
????@Autowired
????lateinit var alarmByEmail: AlarmByEmail
????@Test
????fun testAlarmByEmail() {
????????assert(alarmByEmail.sendMessage("Message Content"))
????}
}

四 如何使用 Kotlin Script 構(gòu)建成 Maven 依賴

使用?maven-publish?插件.

在?build.gradle.kts?中, 主要用法如下 :


// ...
plugins {
????// ...
????`maven-publish`
}
// ...
val sourcesJar by tasks.registering(Jar::class) {
????archiveClassifier.set("sources")
????from(sourceSets.main.get().allSource)
}
publishing {
????publications {
????????register("alarm", MavenPublication::class) {
????????????groupId = "com.looko"
????????????artifactId = "simple-alarm-spring-boot-starter"
????????????version = "0.0.1-SNAPSHOT"
????????????from(components["java"])
????????????artifact(sourcesJar.get())
????????}
????}
????repositories {
????????maven {
????????????mavenLocal()
????????}
????}
}
// ...

在 IDEA 界面 double-ctrl 呼出 run 窗口, 找到?gradle publishToMavenLocal?回車就能打包到?.m2?目錄下了.

或者在右側(cè) gradle 窗口中也能找到相應(yīng)的 gradle task.

如果打到倉庫的包里含有?plain?后綴, 不被 maven 識(shí)別的話, 可以在?build.gradle.kts?中添加如下配置解決:


tasks.getByName<Jar>("jar") {
????archiveClassifier.set("")
}

五 集成測(cè)試

依賴

testImplementation("com.looko:simple-alarm-spring-boot-starter:0.0.1-SNAPSHOT")

配置文件

application.properties


simple.alarm.email.configs[0].host=smtp.163.com
simple.alarm.email.configs[0].senderEmail=xxx@163.com
simple.alarm.email.configs[0].senderPassword=xxx
simple.alarm.email.configs[0].receivers[0]=yyy@163.com
simple.alarm.email.configs[1].host=smtp.163.com
simple.alarm.email.configs[1].senderEmail=yyy@163.com
simple.alarm.email.configs[1].senderPassword=yyy
simple.alarm.email.configs[1].receivers[0]=zzz@163.com
simple.alarm.email.configs[1].receivers[0]=xxx@163.com

或者?application.yml


simple:
??alarm:
????email:
??????configs:
????????- host: smtp.163.com
????????????senderEmail: xxx@163.com
????????????senderPassword: xxx
????????????receivers:
??????????????- yyy@163.com
????????- host: smtp.163.com
????????????senderEmail: yyy@163.com
????????????senderPassword: yyy
????????????receivers:
??????????????- zzz@163.com
??????????????- xxx@163.com


KotlinScript構(gòu)建SpringBootStarter保姆級(jí)教程的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
台南县| 富裕县| 邵阳市| 且末县| 长武县| 台南县| 泸溪县| 塘沽区| 安岳县| 简阳市| 贵南县| 苏尼特左旗| 穆棱市| 扬中市| 肇州县| 丹东市| 溧水县| 庄河市| 阳泉市| 岳普湖县| 体育| 庄浪县| 绥阳县| 平罗县| 来宾市| 武穴市| 宿迁市| 临江市| 乐都县| 团风县| 朝阳市| 志丹县| 许昌市| 勃利县| 周至县| 巢湖市| 读书| 措勤县| 南康市| 宽城| 射洪县|