かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その89 )( Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その88 )( Gradle を 5.3.1 → 6.4 へバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Spring Boot を 2.1.4 → 2.2.7 へバージョンアップします。
    • 依存関係にあるモジュールも一部を除き最新バージョンにバージョンアップします。

参照したサイト・書籍

目次

  1. Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする
  2. Freemarker のテンプレートの拡張子を *.ftl*.ftlh に変更する
  3. 開発環境で Web アプリを起動する時には -XX:TieredStopAtLevel=1 オプションを指定する
  4. logging.filelogging.file.name に変更する
  5. 最後に build で問題がないか確認する

手順

Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする

以下の方針でバージョンアップします。

  • Spring Boot を 2.1.4 → 2.2.7 にバージョンアップする。
  • Gradle の Plugin も最新バージョンにする。
  • checkstyle, spotbugs, pmd, error-prone は後回し。
  • com.google.guava:guava はバージョンアップするとコンパイル時に警告が出るのでバージョンアップしない。
  • doma 2 の最新バージョンは 2.29.0 ですが domaGen タスクが動作しないため 2.28.0 にする。

build.gradle の以下の点を変更します。

buildscript {
    ext {
        group "ksbysample"
        version "2.2.7-RELEASE"
    }
    repositories {
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id "java"
    id "eclipse"
    id "idea"
    id "org.springframework.boot" version "2.2.7.RELEASE"
    id "io.spring.dependency-management" version "1.0.9.RELEASE"
    id "groovy"
    id "net.ltgt.errorprone" version "0.7.1"
    id "checkstyle"
//    id "com.github.spotbugs" version "1.6.9"
    id "pmd"
    id "com.moowork.node" version "1.3.1"
    id "com.gorylenko.gradle-git-properties" version "2.2.2"
// Gradle 5.3 で internal API が変更されて gradle-processes が動かなくなったのでコメントアウトする
//    id "com.github.johnrengelman.processes" version "0.5.0"
    id "com.energizedwork.webdriver-binaries" version "1.4"
}

..........

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }

    // annotationProcessor と testAnnotationProcessor、compileOnly と testCompileOnly を併記不要にする
    testAnnotationProcessor.extendsFrom annotationProcessor
    testImplementation.extendsFrom compileOnly

    // for Doma 2
    domaGenRuntime
}

..........

dependencyManagement {
    imports {
        // mavenBom は以下の URL のものを使用する
        // https://repo.spring.io/release/org/springframework/boot/spring-boot-starter-parent/2.1.4.RELEASE/
        // bomProperty に指定可能な property は以下の URL の BOM に記述がある
        // https://repo.spring.io/release/org/springframework/boot/spring-boot-dependencies/2.1.4.RELEASE/spring-boot-dependencies-2.1.4.RELEASE.pom
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
        mavenBom("org.junit:junit-bom:5.6.2")
    }
}

dependencies {
    def spockVersion = "1.3-groovy-2.5"
    def domaVersion = "2.28.0"
    def lombokVersion = "1.18.12"
    def errorproneVersion = "2.3.3"
    def powermockVersion = "2.0.7"
    def seleniumVersion = "3.141.59"
    def spotbugsVersion = "3.1.11"

    // dependency-management-plugin によりバージョン番号が自動で設定されるもの
    // Appendix F. Dependency versions ( https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/html/appendix-dependency-versions.html ) 参照
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-freemarker")
    implementation("org.springframework.boot:spring-boot-starter-mail")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.boot:spring-boot-starter-actuator")
    runtimeOnly("org.springframework.boot:spring-boot-devtools")
    implementation("org.springframework.session:spring-session-core")
    implementation("org.springframework.session:spring-session-jdbc")
    implementation("org.codehaus.janino:janino")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation("org.yaml:snakeyaml")

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    implementation("com.integralblue:log4jdbc-spring-boot-starter:2.0.0")
    implementation("org.flywaydb:flyway-core:5.2.4")
    implementation("com.h2database:h2:1.4.200")
    implementation("com.github.rozidan:modelmapper-spring-boot-starter:2.3.1")
    implementation("com.google.guava:guava:27.1-jre")
    implementation("org.apache.commons:commons-lang3:3.8.1")
    testImplementation("org.dbunit:dbunit:2.7.0")
    testImplementation("org.assertj:assertj-core:3.16.0")
    testImplementation("org.spockframework:spock-core:${spockVersion}")
    testImplementation("org.spockframework:spock-spring:${spockVersion}")
    testImplementation("org.jsoup:jsoup:1.13.1")
    testImplementation("com.icegreen:greenmail:1.5.13")

    // for lombok
    annotationProcessor("org.projectlombok:lombok:${lombokVersion}")
    compileOnly("org.projectlombok:lombok:${lombokVersion}")

    // for Doma
    annotationProcessor("org.seasar.doma:doma:${domaVersion}")
    implementation("org.seasar.doma:doma:${domaVersion}")
    domaGenRuntime("org.seasar.doma:doma-gen:${domaVersion}")
    domaGenRuntime("com.h2database:h2:1.4.200")

    // for Error Prone ( http://errorprone.info/ )
    errorprone("com.google.errorprone:error_prone_core:${errorproneVersion}")
    compileOnly("com.google.errorprone:error_prone_annotations:${errorproneVersion}")

    // PowerMock
    testImplementation("org.powermock:powermock-module-junit4:${powermockVersion}")
    testImplementation("org.powermock:powermock-api-mockito2:${powermockVersion}")

    // for Geb + Spock
    testImplementation("org.gebish:geb-spock:3.4") {
        exclude group: "org.codehaus.groovy", module: "groovy-all"
    }
    testImplementation("org.seleniumhq.selenium:selenium-chrome-driver:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-firefox-driver:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-support:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-api:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-remote-driver:${seleniumVersion}")

    // for SpotBugs
//    compileOnly("com.github.spotbugs:spotbugs:${spotbugsVersion}")
//    compileOnly("net.jcip:jcip-annotations:1.0")
//    compileOnly("com.github.spotbugs:spotbugs-annotations:${spotbugsVersion}")
//    testImplementation("com.google.code.findbugs:jsr305:3.0.2")

    // for JUnit 5
    // junit-jupiter で junit-jupiter-api, junit-jupiter-params, junit-jupiter-engine の3つが依存関係に追加される
    testCompile("org.junit.jupiter:junit-jupiter")
    testRuntime("org.junit.platform:junit-platform-launcher")
}

..........
  • buildscript block の以下の点を変更します。
    • version "2.1.4-RELEASE"version "2.2.7-RELEASE" に変更します。
    • maven { url "https://plugins.gradle.org/m2/" }gradlePluginPortal() に変更します。
  • plugins block の以下の点を変更します。
    • id "org.springframework.boot"version "2.1.4.RELEASE"version "2.2.7.RELEASE" に変更します。
    • id "io.spring.dependency-management"version "1.0.7.RELEASE"version "1.0.9.RELEASE" に変更します。
    • id "com.gorylenko.gradle-git-properties"version "2.0.0"version "2.2.2" に変更します。
  • configurations block の以下の点を変更します。
    • developmentOnly を追加します。
    • runtimeClasspath { extendsFrom developmentOnly } を追加します。
  • dependencyManagement block の以下の点を変更します。
    • mavenBom("org.junit:junit-bom:5.4.2")mavenBom("org.junit:junit-bom:5.6.2") に変更します。
  • dependencies block の以下の点を変更します。
    • def domaVersion = "2.24.0"def domaVersion = "2.28.0" に変更します。
    • def lombokVersion = "1.18.6"def lombokVersion = "1.18.12" に変更します。
    • def powermockVersion = "2.0.0"def powermockVersion = "2.0.7" に変更します。
    • implementation("com.integralblue:log4jdbc-spring-boot-starter:1.0.2")implementation("com.integralblue:log4jdbc-spring-boot-starter:2.0.0") に変更します。
    • implementation("org.flywaydb:flyway-core:5.2.4")implementation("org.flywaydb:flyway-core:6.4.1") に変更します。
    • implementation("com.h2database:h2:1.4.192")implementation("com.h2database:h2:1.4.200") に変更します。
    • implementation("com.github.rozidan:modelmapper-spring-boot-starter:1.0.0")implementation("com.github.rozidan:modelmapper-spring-boot-starter:2.3.1") に変更します。
    • implementation("org.apache.commons:commons-lang3:3.8.1")implementation("org.apache.commons:commons-lang3:3.10") に変更します。
    • testImplementation("org.dbunit:dbunit:2.6.0")testImplementation("org.dbunit:dbunit:2.7.0") に変更します。
    • testImplementation("org.assertj:assertj-core:3.12.2")testImplementation("org.assertj:assertj-core:3.16.0") に変更します。
    • testImplementation("org.jsoup:jsoup:1.11.3")testImplementation("org.jsoup:jsoup:1.13.1") に変更します。
    • testImplementation("com.icegreen:greenmail:1.5.10")testImplementation("com.icegreen:greenmail:1.5.13") に変更します。
    • domaGenRuntime("com.h2database:h2:1.4.192")domaGenRuntime("com.h2database:h2:1.4.200") に変更します。

変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、特にエラーは出ずに更新されました。

clean タスク実行 → Rebuild Project 実行 → build タスク実行をしてみると、テストが 13件失敗しました。

f:id:ksby:20200509130021p:plain

エラーメッセージは全て org.h2.jdbc.JdbcSQLException at InquiryTestSpec.groovy:29 Caused by: java.net.SocketTimeoutException at InquiryTestSpec.groovy:29 で、原因は build タスクでは実行されないようにしていた Geb のテストが JUnit 5 のテストを実行するように設定していたはずの test タスクで実行されていたからでした。

build.gradle の test タスクに exclude "geb/**" を追加して Geb のテストが除外されるようにします。

test {
    // test タスクの jvmArgs は tasks.withType(Test) { ... } で定義している
    exclude "geb/**"

    // for JUnit 5
    useJUnitPlatform()

    testLogging {
        afterSuite printTestCount
    }
}

再度 clean タスク実行 → Rebuild Project 実行 → build タスク実行をしてみると今度は BUILD SUCCESSFUL が表示されました。

f:id:ksby:20200509131800p:plain

Freemarker のテンプレートの拡張子を *.ftl*.ftlh に変更する

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その5 )( Release Notes を見て必要な箇所を変更する ) で変更した内容を boot-npm-geb-sample にも反映します。

以下のファイルの拡張子を *.ftl*.ftlh に変更します。

src/main/resources/templates/mail/inquirymail-body.ftlh

開発環境で Web アプリを起動する時には -XX:TieredStopAtLevel=1 オプションを指定する

build.gradle の bootRun タスクに "-XX:TieredStopAtLevel=1" を追加します。

bootRun {
    jvmArgs = jvmArgsForTask +
            jvmArgsAddOpens +
            [
                    "-Dspring.profiles.active=develop",
                    "-XX:TieredStopAtLevel=1"
            ]
}

logging.filelogging.file.name に変更する

src/main/resources/application-product.properties 内の設定を logging.file → logging.file.name に変更します。

server.tomcat.basedir=C:/webapps/boot-npm-geb-sample
logging.file.name=${server.tomcat.basedir}/logs/boot-npm-geb-sample.log

最後に build で問題がないか確認する

clean タスク実行 → Rebuild Project 実行 → build タスク実行をすると BUILD SUCCESSFUL が表示されます(と思いましたが testJUnit4AndSpock と test タスクのどちらも 147 tests になっていました、次の回で解消します)。

f:id:ksby:20200509160327p:plain

Web アプリを起動してから gebTest タスクを実行するとこちらも BUILD SUCCESSFUL が表示されます。

f:id:ksby:20200509161041p:plain

履歴

2020/05/10
初版発行。