将Spring Boot 1.5系版本升级至2.1系版本的讨论

首先/起初/开头

你好,我是@chan_kaku。
这次我想讨论一下今年8月份SpringBoot1.5系列将停止更新的问题,以及在应对这个问题时遇到的困难和经验。

关于SpringBoot

SpringBoot是基于Spring框架的一种可以轻松创建应用程序的框架。请查看官方文档以获取更详细信息。

进行的事情(概述)

    • Gradle3系 → Gradle5系

 

    • SpringBoot1.5系 → SpringBoot2.1系

 

    その他依存ライブラリのバージョンアップ

Gradle 3版本 → Gradle 5版本

为了升级到SpringBoot2系列,首先需要将Gradle版本升级到4.4以上,因此我们从这方面入手。
本次目标项目使用了GradleWrapper,因此我们修改了gradle-wrapper.properties文件如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip #ここのバージョンを変更しました

SpringBoot1.5系改为SpringBoot2.1系。

在上述的处理中,终于能够使用Spring Boot 2系列,因此在这里我们将升级版本。
基本事项已在此Spring Boot的Github Wiki中记录,请参阅。

plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

修改項目

根据文档的说明,尽管不是boot1.5系列,但似乎需要添加io.spring.dependency-management。

插件的编写方法

在Gradle 3版本中,对Java和SpringBoot等内容进行了以下说明。

apply plugin: 'java'
apply plugin: 'org.springframework.boot'

然而,从Gradle 5开始,写法已经发生变化,建议将其作为一个块来写,例如以下方式。

plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE'
    id 'java'
}
依赖项的编写方式

依赖关系的写法也发生了重大变化。
在Gradle 3.x版本之前,写法如下所示。

compile('org.springframework.boot:spring-boot-starter')
compile('org.springframework.boot:spring-boot-starter-web')
//.....などなど

基本上,依賴庫通常是用compile來寫的。
然而,在Gradle 5系中,implementation這種寫法增加了,compile已經變成了deprecated。
compile和implementation的區別主要是依賴關係的傳遞範圍。
因此,我們將原本用compile表示的部分暫時替換為implementation。

implementaion('org.springframework.boot:spring-boot-starter')
implementaion('org.springframework.boot:spring-boot-starter-web')
//.....などなど
关于罐子周围的写作方式

这部分也经过了一些小的更改。官方文件。

以前我以这样的方式写作。

jar {
    baseName = "hoge"
    archiveName = "${baseName}.jar"
    version = "1.0.0-SNAPSHOT"
}

因为baseName和archiveName被弃用,我根据文档作出了以下修改。

jar {
    archiveBaseName = "hoge"
    archiveFileName = "${archiveBaseName}.jar"
    version = "1.0.0-SNAPSHOT"
}

baseName已更改为archiveBaseName
archiveName已更改为archiveFileName
由于appendix等其他部分也已更改,敬请参阅文档!!

在其他方面也遇到了困难的地方等等

关于doma2

这次版本更新的项目中,我们使用了doma2进行数据库访问。在原来的依赖项中,我写了以下内容。

compile('org.seasar.doma.boot:doma-spring-boot-starter:1.1.0')

根据上面的dependencies写法,我简单地将compile替换为implementation,但却遇到了意想不到的困难。
由于在进行DI(依赖注入)的类中未注册Dao的Bean,因此出现无法进行DI的错误。
困扰了一段时间,但是一次偶然的机会,我看了一下doma2的文档,发现与原来的build.gradle有所不同,
经过以下的更改后,关于Dao的Bean注册问题顺利解决了!

implementation('org.seasar.doma.boot:doma-spring-boot-starter:1.1.1')
implementation("org.seasar.doma:doma:2.24.0")
annotationProcessor("org.seasar.doma:doma:2.24.0")

以前,只使用了doma-spring-boot-starter作为最顶层的依赖库来运行,但现在需要通过implementation添加’doma’本身,并且似乎还需要使用annotationProcessor。这个annotationProcessor是在Gradle 5版本中新添加的,需要添加的原因是因为从Gradle 5版本开始,无法从编译时的类路径获取注解处理器。因此,如果除了doma之外还使用了从类路径中获取注解处理器的库,就必须像这样添加annotationProcessor。

关于Jackson

jackson(ジャクソン)是用于处理JSON格式数据的Java库,在本项目中被使用。
和上一次将compile简单替换为implementation一样,这次在将它替换为implementation后,jackson库中的Bean注册也出现了类似doma2时的错误。
通过将版本更新到最新版,这个问题得以解决。

最后

为了测试这次迁移有多难,我们选择了尽可能少依赖于库的项目进行测试。然而,遇到了比预想中更多的问题,个人感觉很困难。考虑到1.5版本将在今年8月停止支持,建议尽快迁移!希望本文对大家有所帮助。

参考网站

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide -> Spring Boot 2.0 迁移指南

https://qiita.com/yukina-ge/items/1ca029ed69494bfd36d6 -> 基于 Qiita 的文章:1ca029ed69494bfd36d6

https://qiita.com/opengl-8080/items/6ad642e0b016465891de -> 基于 Qiita 的文章:6ad642e0b016465891de

https://doma.readthedocs.io/en/2.19.2/build/ -> Doma 2.19.2 构建文档

广告
将在 10 秒后关闭
bannerAds