Spring Boot の マイグレーション 1.5.x → 2.2.x マルチプロジェクト最小構成
Spring Bootが2になって、マイグレーションの際に必要な変更について整理しました。
プロジェクトはマルチプロジェクトの最小構成で、
実際のバージョンは、1.5.22 → 2.2.0です。
参考資料
- Gradle で Spring Boot 2 のマルチプロジェクト - Qiita
- Springboot + Thymeleaf + Layout Dialectを使って画面レイアウトを共通化する - Qiita
- Spring Boot 1.5→2.1 に移行したときのお話
- Spring Boot 2.0 Migration Guide ※公式、英語
build.gradle
の修正内容
ここでは、build.gradle
の変更のみ記載します。それ以外の変更も含め、個々の説明は、次項に書いています。
今回は、最小限の対応となります。
他にもいくつか便利な機能があるみたいですが、それは他の方の記事(参考サイト3など)をご覧ください。
version = '1.0.0-SNAPSHOT' buildscript { ext { // ↓変更 // springBootVersion = '1.5.22.RELEASE' springBootVersion = '2.2.0.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } subprojects { apply plugin: 'java' // ↓削除(移動) //apply plugin: 'org.springframework.boot' // ↓追加 apply plugin: 'io.spring.dependency-management' group = 'argius' sourceCompatibility = 10 repositories { mavenCentral() } // ↓追加 dependencyManagement { imports { mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}" } } } project(':base') { dependencies { compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-thymeleaf') testCompile('org.springframework.boot:spring-boot-starter-test') // ↓追加 compile('nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:2.4.1') } } project(':myapp1') { // ↓追加(移動) apply plugin: 'org.springframework.boot' dependencies { compile project(':base') } } project(':myapp2') { // ↓追加(移動) apply plugin: 'org.springframework.boot' dependencies { compile project(':base') } }
解説
io.spring.dependency-management
プラグインの追加
subprojects
ブロックに以下の設定を追加します。
apply plugin: 'io.spring.dependency-management' dependencyManagement { imports { mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}" } }
Spring Bootプラグインをsubprojectsでなくサブプロジェクトごとに設定
Spring Bootプラグインをsubprojects
ブロックに書いていたのを、個々のサブプロジェクトごとに設定します。
他の方法もあるみたいですが、こちらが推奨される方法のようです。
詳しくは、参考サイト1を参照。
Thymeleafのレイアウトライブラリー適用
詳しくは調べていませんが、Thymeleafのバージョンが上がったことで、レイアウト機能の依存関係が変わっているようです。
以下の設定をdependenciesに追加します。
compile('nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:2.4.1')
コンパイル警告: 非推奨API WebMvcConfigurerAdapter
@Configuration
のクラスに実装するインターフェイスWebMvcConfigurer
のデフォルト実装は、Spring 4まではWebMvcConfigurerAdapter
を継承して使用していましたが、Spring 5では直接インターフェイスにデフォルト実装が追加され(そのためJava8以降が必須になった)、WebMvcConfigurerAdapter
が非推奨になっています。
// import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; // @Configurationの付いているクラス // extends WebMvcConfigurerAdapter implements WebMvcConfigurer
プロパティーserver.
の変更
(2019-12-08 追記)
おそらく、Springのバージョンが上がった影響です。
アプリケーションプロパティーのうち、server.
で始まるものが、server.servlet.
に変更になっています。
とりあえず、実際に使っているものではコンテキストパスとかタイムアウトはこんな感じです。
server.contextPath
→server.servlet.contextPath
server.session.timeout
→server.servlet.session.timeout
security
プロパティーの廃止
(2019-12-08 追記)
これもおそらく、Springのバージョンが上がった影響です。
Spring Securityをアプリケーションプロパティーで設定できなくなりました。
WebSecurityConfigurer
経由でAuthenticationManagerBuilder
にAuthenticationProvider
の実装クラスを登録します。
// WebSecurityConfigurerのメソッド @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(new BasicAuthenticationProvider()); } public class BasicAuthenticationProvider implements AuthenticationProvider { @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String name = authentication.getName(); String password = authentication.getCredentials().toString(); if (isValidBasicAuth(name, password)) { // checkBasicAuthは独自メソッド return new UsernamePasswordAuthenticationToken(name, password, authentication.getAuthorities()); } throw new AuthenticationCredentialsNotFoundException("basic auth error"); } @Override public boolean supports(Class<?> authentication) { return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } }
参考:Gradle5の対応
依存関係の設定で、compile
でなくimplementation
が推奨されるようです。(めんどくさい...)
終わりに
調べ始めた時は、この程度の規模なのに大掛かりな変更が必要になるのかと気が重かったですが、思ったより簡潔になったので、ほっとしています。
(おわり)