将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 构建文档