かんがるーさんの日記

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

Spring Boot 2.0.x の Web アプリを 2.1.x へバージョンアップする ( その3 )( build.gradle を変更する )

概要

記事一覧はこちらです。

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その3 )( build.gradle を変更する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • build.gradle を変更します。
      • Spring Initializr で 2.1.2 のプロジェクトを作成して、変更した方がよい点があれば反映します。
      • Spring Boot のバージョンを 2.0.8 → 2.1.2 に変更します。
      • ライブラリは最新バージョンにアップデートします。

参照したサイト・書籍

目次

  1. Spring Initializr で 2.1.2 のプロジェクトを作成する
  2. build.gradle を変更する
  3. Rebuild Project 実行時に出るエラーを修正する
    1. java: org.springframework.boot.web.client.RestTemplateBuilderのsetConnectTimeout(int)は非推奨になりました/setReadTimeout(int)は非推奨になりました
  4. build タスク実行時に出るエラーを修正する
    1. エラー: BaseTestSqlは繰返し可能な注釈型ではありません/エラー: TestDataは繰返し可能な注釈型ではありません
    2. spring-boot-test-2.1.2.RELEASE.jar(/org/springframework/boot/test/context/SpringBootTest.class): 警告:タイプ'ExtendWith'内に注釈メソッド'value()'が見つかりません: org.junit.jupiter.api.extension.ExtendWithのクラス・ファイルが見つかりません
  5. メモ書き&次回は。。。

手順

Spring Initializr で 2.1.2 のプロジェクトを作成する

Spring Initializr で 2.1.2 のプロジェクトを作成して、生成された build.gradle を見て反映した方が良い点があるか確認します。

f:id:ksby:20190209014309p:plain f:id:ksby:20190209014403p:plain f:id:ksby:20190209014702p:plain f:id:ksby:20190209014752p:plain f:id:ksby:20190209014835p:plain f:id:ksby:20190209015041p:plain f:id:ksby:20190209015125p:plain f:id:ksby:20190209015254p:plain f:id:ksby:20190209015329p:plain f:id:ksby:20190209015720p:plain f:id:ksby:20190209015809p:plain

以下の build.gradle が作成されました。

buildscript {
    ext {
        springBootVersion = '2.1.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
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-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    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-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.flywaydb:flyway-core'
    implementation 'org.springframework.retry:spring-retry'
    implementation 'org.springframework.session:spring-session-data-redis'
    runtimeOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.postgresql:postgresql'
    compileOnly 'org.springframework.boot:spring-boot-configuration-processor'
    compileOnly 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

今回は反映した方が良さそうな点はありませんでした。

build.gradle を変更する

build.gradle を以下のように変更します。

buildscript {
    ext {
        group "ksbysample"
        version "2.1.2-RELEASE"
    }
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/release/" }
        maven { url "https://plugins.gradle.org/m2/" }
    }
}

plugins {
    id "java"
    id "eclipse"
    id "idea"
    id "org.springframework.boot" version "2.1.2.RELEASE"
    id "io.spring.dependency-management" version "1.0.6.RELEASE"
    id "groovy"
    id "checkstyle"
    id "com.github.spotbugs" version "1.6.9"
    id "pmd"
    id "net.ltgt.errorprone" version "0.0.16"
    id "de.undercouch.download" version "3.4.3"
    id "com.gorylenko.gradle-git-properties" version "2.0.0"
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

wrapper {
    gradleVersion = "5.2"
    distributionType = Wrapper.DistributionType.ALL
}

[compileJava, compileTestGroovy, compileTestJava]*.options*.encoding = "UTF-8"
[compileJava, compileTestGroovy, compileTestJava]*.options*.compilerArgs = [
        "-Xlint:all,-options,-processing,-path"
        , "-Xep:RemoveUnusedImports:WARN"
        , "-Xep:InsecureCryptoUsage:OFF"
        , "-Xep:ParameterName:OFF"
]

// for Doma 2
// JavaクラスとSQLファイルの出力先ディレクトリを同じにする
processResources.destinationDir = compileJava.destinationDir
// コンパイルより前にSQLファイルを出力先ディレクトリにコピーするために依存関係を逆転する
compileJava.dependsOn processResources

springBoot {
    buildInfo()
}

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

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

    // for Doma 2
    domaGenRuntime
}

checkstyle {
    configFile = file("${rootProject.projectDir}/config/checkstyle/google_checks.xml")
    toolVersion = "8.17"
    sourceSets = [project.sourceSets.main]
}

spotbugs {
    toolVersion = "3.1.11"
    ignoreFailures = true
    effort = "max"
    spotbugsTest.enabled = false
}
tasks.withType(com.github.spotbugs.SpotBugsTask) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}

pmd {
    toolVersion = "6.11.0"
    sourceSets = [project.sourceSets.main]
    ignoreFailures = true
    consoleOutput = true
    ruleSetFiles = rootProject.files("/config/pmd/pmd-project-rulesets.xml")
    ruleSets = []
}
pmdMain {
    def backupLoggerLevel
    doFirst {
        backupLoggerLevel = logger.context.level
        logger.context.level = LogLevel.QUIET
    }
    doLast {
        logger.context.level = backupLoggerLevel
    }
}

repositories {
    mavenCentral()
}

dependencyManagement {
    imports {
        // mavenBom は以下の URL のものを使用する
        // https://repo.spring.io/release/org/springframework/boot/spring-boot-starter-parent/2.0.7.RELEASE/
        // bomProperty に指定可能な property は以下の URL の BOM に記述がある
        // https://repo.spring.io/release/org/springframework/boot/spring-boot-dependencies/2.0.7.RELEASE/spring-boot-dependencies-2.0.7.RELEASE.pom
        mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES) {
            // Spring Boot の BOM に定義されているバージョンから変更する場合には、ここに以下のように記述する
            // bomProperty "thymeleaf.version", "3.0.9.RELEASE"
        }
    }
}

dependencies {
    def jdbcDriver = "org.postgresql:postgresql:42.2.5"
    def spockVersion = "1.2-groovy-2.5"
    def domaVersion = "2.23.0"
    def lombokVersion = "1.18.4"
    def errorproneVersion = "2.3.1"
    def powermockVersion = "2.0.0"
    def spotbugsVersion = "3.1.11"

    // dependency-management-plugin によりバージョン番号が自動で設定されるもの
    // Appendix F. Dependency versions ( https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-dependency-versions.html ) 参照
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
    implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity5")
    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-data-redis")
    implementation("org.springframework.boot:spring-boot-starter-amqp")
    implementation("org.springframework.boot:spring-boot-starter-actuator")
    runtimeOnly("org.springframework.boot:spring-boot-devtools")
    compileOnly("org.springframework.boot:spring-boot-configuration-processor")
    implementation("org.springframework.session:spring-session-data-redis")
    implementation("org.springframework.retry:spring-retry")
    implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml")
    implementation("org.apache.commons:commons-lang3")
    implementation("org.codehaus.janino:janino")
    implementation("io.micrometer:micrometer-registry-prometheus")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation("org.yaml:snakeyaml")

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    runtimeOnly("${jdbcDriver}")
    implementation("com.integralblue:log4jdbc-spring-boot-starter:1.0.2")
    implementation("org.simpleframework:simple-xml:2.7.1")
    implementation("com.univocity:univocity-parsers:2.8.1")
    implementation("com.google.guava:guava:27.0.1-jre")
    implementation("org.flywaydb:flyway-core:5.2.4")
    implementation("com.zaxxer:HikariCP:3.3.0")
    testImplementation("org.dbunit:dbunit:2.6.0")
    testImplementation("com.icegreen:greenmail:1.5.9")
    testImplementation("org.assertj:assertj-core:3.11.1")
    testImplementation("com.jayway.jsonpath:json-path:2.4.0")
    testImplementation("org.jsoup:jsoup:1.11.3")
    testImplementation("cglib:cglib-nodep:3.2.10")
    testImplementation("org.spockframework:spock-core:${spockVersion}")
    testImplementation("org.spockframework:spock-spring:${spockVersion}")
    
    // for lombok
    // testAnnotationProcessor、testCompileOnly を併記しなくてよいよう configurations で設定している
    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("${jdbcDriver}")

    // 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 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")
}
  • buildscript block の ext block 内で version "2.0.8-RELEASE"version "2.1.2-RELEASE" に変更します。
  • plugins block の以下の点を変更します。
    • id "org.springframework.boot" version "2.0.8.RELEASE"id "org.springframework.boot" version "2.1.2.RELEASE"
    • id "com.github.spotbugs" version "1.6.8"id "com.github.spotbugs" version "1.6.9"
    • id "com.gorylenko.gradle-git-properties" version "2.0.0-beta1"id "com.gorylenko.gradle-git-properties" version "2.0.0"
  • checkstyle block で toolVersion = "8.16"toolVersion = "8.17" に変更します。
  • spotbugs で toolVersion = "3.1.10"toolVersion = "3.1.11" に変更します。
  • pmd で toolVersion = "6.10.0"toolVersion = "6.11.0" に変更します。
  • dependencyManagement block から bomProperty "groovy.version", "2.5.4" を削除します。
  • dependencies block の以下の点を変更します。
    • def domaVersion = "2.21.0"def domaVersion = "2.23.0"
    • def spotbugsVersion = "3.1.10"def spotbugsVersion = "3.1.11"
    • implementation("com.univocity:univocity-parsers:2.7.6")implementation("com.univocity:univocity-parsers:2.8.1")

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

Rebuild Project 実行時に出るエラーを修正する

clean タスク実行 → Rebuild Project 実行 をするとエラーが出るので修正します。

f:id:ksby:20190209023252p:plain

java: org.springframework.boot.web.client.RestTemplateBuilderのsetConnectTimeout(int)は非推奨になりました/setReadTimeout(int)は非推奨になりました

エラーが出たのは src/main/java/ksbysample/webapp/lending/service/calilapi/CalilApiService.java の以下の箇所でした。

f:id:ksby:20190209024706p:plain

RestTemplateBuilder#setConnectTimeout, setReadTimeout の引数が int 型のメソッドは非推奨となり Duration 型で指定するメソッドに変わったためでした。Spring Boot 2.1 Release Notes - Deprecations in Spring Boot 2.1 に記述があります。引数に渡している定数 CONNECT_TIMEOUT、READ_TIMEOUT を int 型から Duration 型に変更します。

f:id:ksby:20190209025351p:plain

build タスク実行時に出るエラーを修正する

build タスク実行をするとエラーが出るので修正します。

f:id:ksby:20190209030329p:plain f:id:ksby:20190209030415p:plain

エラー: BaseTestSqlは繰返し可能な注釈型ではありません/エラー: TestDataは繰返し可能な注釈型ではありません

こちらから先に対応します。エラーが出たのは src/test/java/ksbysample/webapp/lending/TestDataResourceTest.java の以下の箇所でした。

f:id:ksby:20190209031051p:plain f:id:ksby:20190209031232p:plain

調べてみると、

  • @Repeatable アノテーションが付いている他の繰返し可能な注釈型を見ましたが、違いがあるようには見えませんでした。
  • demo プロジェクトに BaseTestSql、BaseTestSqlList のファイルをコピーしてテストクラスを作成して付与してみましたが、再現せず。
  • そもそも動かないのではなくて compile が通らない。
  • gradlew build --stacktrace --debug を実行してみると以下のログが出力されていました。
17:18:41.054 [INFO] [org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilerDecorator] Full recompilation is required because no incremental change information is available. This is usually caused by clean builds or changing compiler arguments.
17:18:41.055 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Compile Java for :compileTestJava' started
17:18:41.062 [DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: -source 1.8 -target 1.8 -d D:\project-springboot\ksbysample-webapp-lending\build\classes\java\test -encoding UTF-8 -g -sourcepath  -processorpath C:\Users\root\.gradle\caches\modules-2\files-2.1\org.projectlombok\lombok\1.18.4\7103ab519b1cdbb0642ad4eaf1db209d905d0f96\lombok-1.18.4.jar;C:\Users\root\.gradle\caches\modules-2\files-2.1\org.seasar.doma\doma\2.23.0\f5340b3f807100eaa28e725cf9ec891df6441a9c\doma-2.23.0.jar -s D:\project-springboot\ksbysample-webapp-lending\build\generated\sources\annotationProcessor\java\test -XDuseUnsharedTable=true -classpath D:\project-springboot\ksbysample-webapp-lending\build\classes\java\main;.....(長いので classpath は途中省略する).....C:\Users\root\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.11.1\268f0fe4df3eefe052b57c87ec48517d64fb2a10\log4j-api-2.11.1.jar -Xlint:all,-options,-processing,-path -Xep:RemoveUnusedImports:WARN -Xep:InsecureCryptoUsage:OFF -Xep:ParameterName:OFF D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\helper\SimpleRequestBuilder.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\helper\TestHelper.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\matcher\CustomModelResultMatchers.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\matcher\ErrorsResultMatchers.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\matcher\HtmlResultMatchers.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\AssertOptions.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\BaseTestData.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\BaseTestSql.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\BaseTestSqlList.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\DbUnitUtils.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\NoUseTestDataResource.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\TableDataAssert.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\TestData.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\TestDataList.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\TestDataLoader.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\TestDataResource.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\TestSql.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\TestSqlExecutor.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\db\TestSqlList.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\mail\MailServerResource.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\common\test\rule\mockmvc\SecurityMockMvcResource.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\test\Item.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\test\ItemTypeStringToCodeConversion.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\test\StringToLocalDateTimeConversion.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\test\UniVocityParsersTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\helper\library\LibraryHelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\helper\mail\EmailHelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\helper\mail\Mail001HelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\helper\mail\Mail002HelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\helper\mail\Mail003HelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\helper\message\MessagesPropertiesHelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\helper\url\UrlAfterLoginHelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\helper\user\UserHelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\listener\rabbitmq\InquiringStatusOfBookQueueListenerTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\security\LendingUserDetailsHelperTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\security\LendingUserDetailsServiceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\security\LendingUserDetailsTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\service\calilapi\CalilApiServiceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\service\file\BooklistCsvFileServiceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\service\queue\InquiringStatusOfBookQueueServiceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\service\UserInfoServiceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\TestDataResourceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\values\validation\ValuesEnumValidatorTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\admin\library\AdminLibraryControllerTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\admin\library\AdminLibraryServiceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\booklist\BooklistControllerTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\booklist\BooklistServiceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\booklist\UploadBooklistFormValidatorTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\confirmresult\ConfirmresultControllerTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\ExceptionHandlerAdviceTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\lendingapp\LendingappControllerTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\lendingapp\LendingappFormValidatorTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\lendingapproval\LendingapprovalControllerTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\lendingapproval\LendingapprovalFormValidatorTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\LoginControllerTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\web\WebappErrorControllerTest.java D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\webapi\library\LibraryControllerTest.java
17:18:41.063 [INFO] [net.ltgt.gradle.errorprone.ErrorProneCompiler] Compiling with error-prone compiler
17:18:41.064 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Resolve files of :errorprone' started
17:18:41.064 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Resolve files of :errorprone'
17:18:41.064 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Resolve files of :errorprone' completed
17:18:44.293 [ERROR] [system.err] C:\Users\root\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-test\2.1.2.RELEASE\89b227adbba0d6e9b85a2fde9119ef00428a45e3\spring-boot-test-2.1.2.RELEASE.jar(/org/springframework/boot/test/context/SpringBootTest.class): 警告:タイプ'ExtendWith'内に注釈メソッド'value()'が見つかりません: org.junit.jupiter.api.extension.ExtendWithのクラス・ファイルが見つかりません
17:18:44.493 [ERROR] [system.err] C:\Users\root\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-test\2.1.2.RELEASE\89b227adbba0d6e9b85a2fde9119ef00428a45e3\spring-boot-test-2.1.2.RELEASE.jar(/org/springframework/boot/test/context/SpringBootTest.class): 警告:タイプ'ExtendWith'内に注釈メソッド'value()'が見つかりません: org.junit.jupiter.api.extension.ExtendWithのクラス・ファイルが見つかりません
17:18:44.495 [ERROR] [system.err] D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\TestDataResourceTest.java:24: エラー: BaseTestSqlは繰返し可能な注釈型ではありません
17:18:44.495 [ERROR] [system.err]     @BaseTestSql(order = 2, sql = "update library_forsearch set formal = '図書館サンプル' where systemid = 'Kanagawa_Sample'")
17:18:44.495 [ERROR] [system.err]     ^
17:18:44.495 [ERROR] [system.err] D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\TestDataResourceTest.java:37: エラー: BaseTestSqlは繰返し可能な注釈型ではありません
17:18:44.495 [ERROR] [system.err]         @BaseTestSql(sql = "update user_info set username = 'tanaka jiro' where user_id = 1")
17:18:44.495 [ERROR] [system.err]         ^
17:18:44.495 [ERROR] [system.err] D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\TestDataResourceTest.java:86: エラー: TestDataは繰返し可能な注釈型ではありません
17:18:44.496 [ERROR] [system.err]         @TestData(order = 2, value = "web/confirmresult/testdata/001")
17:18:44.496 [ERROR] [system.err]         ^
17:18:44.496 [ERROR] [system.err] D:\project-springboot\ksbysample-webapp-lending\src\test\java\ksbysample\webapp\lending\TestDataResourceTest.java:97: エラー: TestDataは繰返し可能な注釈型ではありません
17:18:44.496 [ERROR] [system.err]         @TestData(order = 1, value = "web/confirmresult/testdata/001")
17:18:44.496 [ERROR] [system.err]         ^
17:18:44.510 [ERROR] [system.err] エラー4個
17:18:44.510 [ERROR] [system.err] 警告2個
17:18:44.518 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Compile Java for :compileTestJava'
17:18:44.518 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Compile Java for :compileTestJava' completed
17:18:44.518 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Execute compile for :compileTestJava'
17:18:44.519 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Execute compile for :compileTestJava' completed
17:18:44.519 [DEBUG] [org.gradle.api.internal.tasks.execution.DefaultTaskFingerprinter] Fingerprinting property destinationDir (Output) for task ':compileTestJava'
17:18:44.520 [DEBUG] [org.gradle.api.internal.tasks.execution.DefaultTaskFingerprinter] Fingerprinting property options.annotationProcessorGeneratedSourcesDirectory (Output) for task ':compileTestJava'
17:18:44.520 [DEBUG] [org.gradle.internal.execution.impl.steps.CacheStep] Not storing result of task ':compileTestJava' in cache because the execution failed
17:18:44.521 [DEBUG] [org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter] Removed task artifact state for {} from context.
17:18:44.521 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Task :compileTestJava'
17:18:44.521 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Task :compileTestJava' completed
17:18:44.521 [INFO] [org.gradle.execution.plan.DefaultPlanExecutor] :compileTestJava (Thread[Execution worker for ':' Thread 3,5,main]) completed. Took 4.223 secs.

Compiling with error-prone compiler というログがあります。error-prone を入れていない demo プロジェクトでは再現していないので、原因は error-prone かもしれません。

build.gradle を以下のように変更して error-prone を外してみます。

plugins {
    id "java"
    id "eclipse"
    id "idea"
    id "org.springframework.boot" version "2.1.2.RELEASE"
    id "io.spring.dependency-management" version "1.0.6.RELEASE"
    id "groovy"
    id "checkstyle"
    id "com.github.spotbugs" version "1.6.9"
    id "pmd"
// compileエラーが出るので error-prone を一旦コメントアウトする 
//    id "net.ltgt.errorprone" version "0.0.16"
    id "de.undercouch.download" version "3.4.3"
    id "com.gorylenko.gradle-git-properties" version "2.0.0"
}

..........

[compileJava, compileTestGroovy, compileTestJava]*.options*.encoding = "UTF-8"
[compileJava, compileTestGroovy, compileTestJava]*.options*.compilerArgs = [
        "-Xlint:all,-options,-processing,-path"
// compileエラーが出るので error-prone を一旦コメントアウトする 
//        , "-Xep:RemoveUnusedImports:WARN"
//        , "-Xep:InsecureCryptoUsage:OFF"
//        , "-Xep:ParameterName:OFF"
]

..........

dependencies {
    ..........

    // for Error Prone ( http://errorprone.info/ )
// compileエラーが出るので error-prone を一旦コメントアウトする 
//    errorprone("com.google.errorprone:error_prone_core:${errorproneVersion}")
//    compileOnly("com.google.errorprone:error_prone_annotations:${errorproneVersion}")

    ..........

build タスク実行をすると ...は繰返し可能な注釈型ではありません のエラーは出なくなりました。ただし 警告:タイプ'ExtendWith'内に注釈メソッド'value()'が見つかりません のエラーが4つに増えて、大量のテストが失敗していました。

f:id:ksby:20190209175010p:plain

error-prone は Java SE を 11 にバージョンアップした後に対応することにし、しばらくコメントアウトしたままにします。

spring-boot-test-2.1.2.RELEASE.jar(/org/springframework/boot/test/context/SpringBootTest.class): 警告:タイプ'ExtendWith'内に注釈メソッド'value()'が見つかりません: org.junit.jupiter.api.extension.ExtendWithのクラス・ファイルが見つかりません

Spring Boot 2.1 Release Notes - JUnit 5All @…​Test annotations are meta-annotated with @ExtendWith(SpringExtension.class) so this redundant part of the setup can be removed if you’re using JUnit 5. という記述があり @SpringBootTest アノテーションが付いていると @ExtendWith(SpringExtension.class) が自動で付くようになったらしいです。

いろいろ試してみたところ以下の結論でした。

  • JUnit 5 のアノテーションである @ExtendWith(SpringExtension.class) が自動で付くようになったが JUnit 4 → JUnit 5 にバージョンアップしていないため必要なライブラリが存在しない。
  • [compileJava, compileTestGroovy, compileTestJava]*.options*.compilerArgs-Xlint:all を指定しているので、compile 時の警告が出力される。
  • つまり compilerArgs に -Xlint:all を指定するのを止めるか、JUnit 5 にバージョンアップしない限りこの警告は消えない。

今回どこかで JUnit 5 にバージョンアップして警告が出ないようにします。

メモ書き&次回は。。。

今回の調査中に以下の点に気づいたのでメモ書きとして残しておきます。

  • @ComponentScan に @Repeatable が付与されていることに気づきました。このアノテーションは複数付与可能だったんですね。
  • 以前 @Repeatable のサンプルを見て BaseTestSql、BaseTestSqlList を別々のクラス&ファイルで実装したのですが、他の @Repeatable が付与されたアノテーションの実装を見ていたところ List のクラスを別ファイルではなくインナークラスに定義しているものを見かけました。別ファイルにしなくても定義できるようです。

次回は大量のテストが失敗しているのを修正します。

履歴

2019/02/09
初版発行。