argius note

プログラミング関連

Spring Boot の マイグレーション 1.5.x → 2.2.x マルチプロジェクト最小構成

Spring Bootが2になって、マイグレーションの際に必要な変更について整理しました。
プロジェクトはマルチプロジェクトの最小構成で、 実際のバージョンは、1.5.22 → 2.2.0です。

参考資料

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.contextPathserver.servlet.contextPath
  • server.session.timeoutserver.servlet.session.timeout

securityプロパティーの廃止

(2019-12-08 追記)

これもおそらく、Springのバージョンが上がった影響です。

Spring Securityをアプリケーションプロパティーで設定できなくなりました。
WebSecurityConfigurer経由でAuthenticationManagerBuilderAuthenticationProviderの実装クラスを登録します。

// 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が推奨されるようです。(めんどくさい...)

終わりに

調べ始めた時は、この程度の規模なのに大掛かりな変更が必要になるのかと気が重かったですが、思ったより簡潔になったので、ほっとしています。

(おわり)