かんがるーさんの日記

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

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その3 )( build.gradle の修正 )

概要

記事一覧はこちらです。

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その2 )( IntelliJ IDEA の Gradle Tool Window の「Refresh all Gradle projects」を押してもエラーが出ないようにする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • build.gradle の修正

参照したサイト・書籍

  1. gradle 2.12 で対応された compileOnly を試す
    http://qiita.com/or_die/items/709b5c37ff34ee2839b3

  2. gradleのcompileOnlyで指定したライブラリはtestCompileに引き継がれない
    http://qiita.com/gillax/items/1cbcff003384087f2db1

  3. 3.Maven 入門 (2)
    http://www.techscore.com/tech/Java/ApacheJakarta/Maven/3/

    • maven の provided scope を調べた時に参照しました。

目次

  1. Spring Initializr で 1.4.4 のプロジェクトを作成する
  2. build.gradle を修正して build してみる
  3. 次回は。。。

手順

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

  1. 「Welcome to IntelliJ IDEA」ダイアログで「Create New Project」をクリックします。

    f:id:ksby:20170210002217p:plain

  2. 「New Project」ダイアログが表示されます。画面左側のリストから「Spring Initializr」を選択した後、「Next」ボタンをクリックします。

    f:id:ksby:20170210002435p:plain

  3. 次の画面が表示されます。「Type」で「Gradle Project」を選択した後、「Next」ボタンをクリックします。

    f:id:ksby:20170210002709p:plain

  4. 次の画面が表示されます。画面中央上の「Spring Boot」で「1.4.4」を選択してから ksbysample-webapp-lending プロジェクトで使用している以下の項目をチェックした後、「Next」ボタンをクリックします。

    f:id:ksby:20170210003303p:plain f:id:ksby:20170210003427p:plain f:id:ksby:20170210003552p:plain f:id:ksby:20170210003727p:plain f:id:ksby:20170210003928p:plain

  5. 次の画面が表示されます。「Project location」を “C:\project-springboot\demo” に変更した後、「Finish」ボタンをクリックします。

    f:id:ksby:20170210004339p:plain

  6. 「Import Module from Gradle」ダイアログが表示されます。「Create directories for empty content roots automatically」をチェックした後、「OK」ボタンをクリックします。

    f:id:ksby:20170210004636p:plain

これでプロジェクトが作成されて以下の build.gradle が作成されました。

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

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'demo'
    version = '0.0.1-SNAPSHOT'
}

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-data-redis')
    compile('org.springframework.boot:spring-boot-starter-mail')
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('org.springframework.session:spring-session')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('org.springframework.boot:spring-boot-devtools')
    compileOnly('org.projectlombok:lombok')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

以下の点が 1.3.5 で生成した時とは違っていました。これらは反映したいと思います。

  • 以前は apply plugin: 'spring-boot' でしたが apply plugin: 'org.springframework.boot' に変わっています。
  • 以前は入っていた eclipse { ... } の記述がなくなっています。
  • lombok は compile(...) ではなく compileOnly(...) になっています。maven の provided scope に対応したものだそうです。

build.gradle を修正して build してみる

  1. build.gradle を リンク先のその1の内容 に変更します。

  2. Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

    Gradle DSL method not found: 'compileOnly()' のエラーが表示されました。

    f:id:ksby:20170210022345p:plain

  3. 先程 Spring Initializr で作成したプロジェクトと ksbysample-webapp-lending プロジェクトの gradle のバージョンを gradle/wrapper/gradle-wrapper.properties を見て比較すると、前者が gradle-2.13-bin.zip、後者が gradle-2.2-bin.zip でした。

    compileOnly が追加されたのが 2.12 からなので、gradle のバージョンが低いことが原因のようです。

  4. gradle をバージョンアップします。最初に build.gradle を リンク先のその2の内容 に変更します。

  5. gradlew wrapper コマンドを実行します。が、Spring Boot plugin's support for Gradle 2.2 is deprecated. Please upgrade to Gradle 2.9 or later. と出力されてエラーになりました。

    f:id:ksby:20170210024110p:plain

    これは一旦 build.gradle を元に戻して gradle を先にバージョンアップした方がよさそうですね。。。

  6. 現在の build.gradle の内容を別のテキストファイルに退避し、Git でソースの変更を破棄します。

  7. 変更前の build.gradle に対して リンク先のその2の内容 の変更を反映した後、gradlew wrapper コマンドを実行します。

    今度は成功しました。gradle/wrapper/gradle-wrapper.properties を見ると gradle-2.13-bin.zip になっていました。

    f:id:ksby:20170210030459p:plain

  8. 再び build.gradle を リンク先のその1の内容 に変更します。リンク先のその2の内容 も反映します。

  9. Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。今度はエラー等は出ずに終了しました。

  10. clean タスク実行 → Rebuild Project 実行 を実行します。

    Error が 0個、Warning が 37 個出ました。Warning は以下の3種類でした。

    • java: org.springframework.ui.velocityのorg.springframework.ui.velocity.VelocityEngineUtilsは非推奨になりました
    • java: com.univocity.parsers.common.CommonParserSettingsのsetRowProcessor(com.univocity.parsers.common.processor.RowProcessor)は非推奨になりました
    • java: org.springframework.boot.testのorg.springframework.boot.test.SpringApplicationConfigurationは非推奨になりました

    Velocity は Spring Boot 1.5 からサポートされなくなると聞いていましたが、1.4 から非推奨ですか。。。 あとは uniVocity-parsers で RowProcessor が非推奨になったのと、1.4 からテスト用のアノテーションが大きく変更されているようなのでその影響による Warning ですね。

  11. build タスクを実行します。

    テストの結果は 178 tests completed, 165 failed, 8 skipped で、BUILD FAILED が表示されました。Caused by: java.lang.ClassNotFoundException が大量に出力されているのが気になります。

    f:id:ksby:20170211010128p:plain

  12. Project Tool Window の src/test から「Run ‘All Tests’ with Coverage」も実行してみます。

    build タスクの結果から分かっていましたが、ほぼ全滅でした。。。 また build タスクで大量に出ていた ClassNotFoundException ですが、java.lang.NoClassDefFoundError: org/thymeleaf/dialect/IExpressionObjectDialect が原因のようです。

    f:id:ksby:20170211010819p:plain

次回は。。。

1.2.x → 1.3.x へバージョンアップした時と同様に、Rebuild Project 実行時の Warning の解消 → Run ‘All Tests’ with Coverage のエラーの解消 → build タスクの再実行 ( エラーが出れば解消します ) の順で進める予定です。

Velocity の非推奨の対応が悩みどころです。Thymeleaf の 3 から TEXT モードがあるので、これでしょうか。Web で検索したら migration guide がヒットしたのでちょっと読んでみたいと思います。Velocity の対応は後回しにして他の部分だけ進めるかもしれません。

ソースコード

build.gradle

■その1

buildscript {
    ext {
        springBootVersion = '1.4.4.RELEASE'
    }
    repositories {
        jcenter()
        maven { url "http://repo.spring.io/repo/" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE")
        // for Grgit
        classpath("org.ajoberstar:grgit:1.8.0")
        // Gradle Download Task
        classpath("de.undercouch:gradle-download-task:3.2.0")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'de.undercouch.download'
apply plugin: 'groovy'

sourceCompatibility = 1.8
targetCompatibility = 1.8

[compileJava, compileTestGroovy, compileTestJava]*.options*.compilerArgs = ['-Xlint:all,-options,-processing']

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

jar {
    baseName = 'ksbysample-webapp-lending'
    version = '1.1.0-RELEASE'
}

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

configurations {
    domaGenRuntime
}

repositories {
    jcenter()
}

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:Athens-SR3'
    }
}

bootRepackage {
    mainClass = 'ksbysample.webapp.lending.Application'
    excludeDevtools = true
}

dependencies {
    def jdbcDriver = "org.postgresql:postgresql:9.4.1212"

    // dependency-management-plugin によりバージョン番号が自動で設定されるもの
    // Appendix A. Dependency versions ( http://docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions ) 参照
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-velocity")
    compile("org.springframework.boot:spring-boot-starter-mail")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.springframework.boot:spring-boot-starter-redis")
    compile("org.springframework.boot:spring-boot-starter-amqp")
    compile("org.springframework.boot:spring-boot-devtools")
    compile("org.springframework.session:spring-session")
    compile("org.codehaus.janino:janino")
    compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
    compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml")
    testCompile("org.springframework.boot:spring-boot-starter-test")
    testCompile("org.springframework.security:spring-security-test")
    testCompile("org.yaml:snakeyaml")
    testCompile("org.spockframework:spock-core") {
        exclude module: "groovy-all"
    }
    testCompile("org.spockframework:spock-spring") {
        exclude module: "groovy-all"
    }

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    runtime("${jdbcDriver}")
    compile("org.seasar.doma:doma:2.15.0")
    compile("org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16")
    compile("org.apache.commons:commons-lang3:3.5")
    compile("com.google.guava:guava:21.0")
    compile("org.simpleframework:simple-xml:2.7.1")
    compile("com.univocity:univocity-parsers:2.3.1")
    compile("org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.0.RELEASE")
    testCompile("org.dbunit:dbunit:2.5.3")
    testCompile("com.icegreen:greenmail:1.5.3")
    testCompile("org.assertj:assertj-core:3.6.2")
    testCompile("com.jayway.jsonpath:json-path:2.2.0")
    testCompile("org.jmockit:jmockit:1.30")

    // for lombok
    compileOnly("org.projectlombok:lombok:1.16.12")
    testCompileOnly("org.projectlombok:lombok:1.16.12")

    // for Doma-Gen
    domaGenRuntime("org.seasar.doma:doma-gen:2.15.0")
    domaGenRuntime("${jdbcDriver}")
}

bootRun {
    jvmArgs = ['-Dspring.profiles.active=develop']
}

test {
    jvmArgs = ['-Dspring.profiles.active=unittest']
}

// for Doma-Gen
task domaGen << {
    // まず変更が必要なもの
    def rootPackageName  = 'ksbysample.webapp.lending'
    def daoPackagePath   = 'src/main/java/ksbysample/webapp/lending/dao'
    def dbUrl            = 'jdbc:postgresql://localhost/ksbylending'
    def dbUser           = 'ksbylending_user'
    def dbPassword       = 'xxxxxxxx'
    def tableNamePattern = '.*'
    // おそらく変更不要なもの
    def importOfComponentAndAutowiredDomaConfig = "${rootPackageName}.util.doma.ComponentAndAutowiredDomaConfig"
    def workDirPath      = 'work'
    def workDaoDirPath   = "${workDirPath}/dao"

    // 作業用ディレクトリを削除する
    clearDir("${workDirPath}")

    // 現在の Dao インターフェースのバックアップを取得する
    copy() {
        from "${daoPackagePath}"
        into "${workDaoDirPath}/org"
    }

    // Dao インターフェース、Entity クラスを生成する
    ant.taskdef(resource: 'domagentask.properties',
            classpath: configurations.domaGenRuntime.asPath)
    ant.gen(url: "${dbUrl}", user: "${dbUser}", password: "${dbPassword}", tableNamePattern: "${tableNamePattern}") {
        entityConfig(packageName: "${rootPackageName}.entity", useListener: false)
        daoConfig(packageName: "${rootPackageName}.dao")
        sqlConfig()
    }

    // 生成された Dao インターフェースを作業用ディレクトリにコピーし、
    // @ComponentAndAutowiredDomaConfig アノテーションを付加する
    copy() {
        from "${daoPackagePath}"
        into "${workDaoDirPath}/replace"
        filter {
            line -> line.replaceAll('import org.seasar.doma.Dao;', "import ${importOfComponentAndAutowiredDomaConfig};\nimport org.seasar.doma.Dao;")
                    .replaceAll('@Dao', '@Dao\n@ComponentAndAutowiredDomaConfig')
        }
    }

    // @ComponentAndAutowiredDomaConfig アノテーションを付加した Dao インターフェースを
    // dao パッケージへ戻す
    copy() {
        from "${workDaoDirPath}/replace"
        into "${daoPackagePath}"
    }

    // 元々 dao パッケージ内にあったファイルを元に戻す
    copy() {
        from "${workDaoDirPath}/org"
        into "${daoPackagePath}"
    }

    // 作業用ディレクトリを削除する
    clearDir("${workDirPath}")

    // 自動生成したファイルを git add する
    addGit()
}

task downloadCssFontsJs << {
    def staticDirPath   = 'src/main/resources/static'
    def workDirPath     = 'work'
    def adminLTEVersion     = '2.2.0'
    def jQueryVersion       = '2.1.4'
    def fontAwesomeVersion  = '4.3.0'
    def ioniconsVersion     = '2.0.1'
    def html5shivJsVersion  = '3.7.2'
    def respondMinJsVersion = '1.4.2'

    // 作業用ディレクトリを削除する
    clearDir("${workDirPath}")

    // Bootstrap & AdminLTE Dashboard & Control Panel Template
    downloadAdminLTE("${adminLTEVersion}", "${jQueryVersion}", "${workDirPath}", "${staticDirPath}")

    // Font Awesome Icons
    downloadFontAwesome("${fontAwesomeVersion}", "${workDirPath}", "${staticDirPath}")

    // Ionicons
    downloadIonicons("${ioniconsVersion}", "${workDirPath}", "${staticDirPath}")

    // html5shiv.js
    downloadHtml5shivJs("${html5shivJsVersion}", "${workDirPath}", "${staticDirPath}")

    // respond.min.js
    downloadRespondMinJs("${respondMinJsVersion}", "${workDirPath}", "${staticDirPath}")

    // fileinput.min.js ( v4.2.7 )
    downloadBootstrapFileInputMinJs("${workDirPath}", "${staticDirPath}")

    // 作業用ディレクトリを削除する
    clearDir("${workDirPath}")

    // 追加したファイルを git add する
    addGit()
}

task printClassWhatNotMakeTest << {
    def srcDir = new File("src/main/java");
    def excludePaths = [
            "src/main/java/ksbysample/webapp/lending/Application.java"
            , "src/main/java/ksbysample/webapp/lending/config"
            , "src/main/java/ksbysample/webapp/lending/cookie"
            , "src/main/java/ksbysample/webapp/lending/dao"
            , "src/main/java/ksbysample/webapp/lending/entity"
            , "src/main/java/ksbysample/webapp/lending/exception"
            , "src/main/java/ksbysample/webapp/lending/helper/download/booklistcsv"
            , "src/main/java/ksbysample/webapp/lending/helper/download/DataDownloadHelper.java"
            , "src/main/java/ksbysample/webapp/lending/helper/page/PagenationHelper.java"
            , "src/main/java/ksbysample/webapp/lending/security/LendingUser.java"
            , "src/main/java/ksbysample/webapp/lending/security/RoleAwareAuthenticationSuccessHandler.java"
            , "src/main/java/ksbysample/webapp/lending/service/calilapi/response"
            , "src/main/java/ksbysample/webapp/lending/service/file/BooklistCSVRecord.java"
            , "src/main/java/ksbysample/webapp/lending/service/openweathermapapi"
            , "src/main/java/ksbysample/webapp/lending/service/queue/InquiringStatusOfBookQueueMessage.java"
            , "src/main/java/ksbysample/webapp/lending/util/doma"
            , "src/main/java/ksbysample/webapp/lending/util/velocity/VelocityUtils.java"
            , "src/main/java/ksbysample/webapp/lending/values/validation/ValuesEnum.java"
            , "src/main/java/ksbysample/webapp/lending/view/BookListCsvView.java"
            , "src/main/java/ksbysample/webapp/lending/web/.+/.+Service.java"
            , "src/main/java/ksbysample/webapp/lending/webapi/common/CommonWebApiResponse.java"
            , "src/main/java/ksbysample/webapp/lending/webapi/weather"
    ];
    def excludeFileNamePatterns = [
            ".*EventListener.java"
            , ".*Dto.java"
            , ".*Form.java"
            , ".*Values.java"
    ];

    compareSrcAndTestDir(srcDir, excludePaths, excludeFileNamePatterns);
}

/* -----------------------------------------------------------------------------
 * メソッド定義部
 ---------------------------------------------------------------------------- */
void clearDir(String dirPath) {
    delete dirPath
}

void addGit() {
    def grgit = org.ajoberstar.grgit.Grgit.open(dir: project.projectDir)
    grgit.add(patterns: ['.'])
}

void downloadAdminLTE(String adminLTEVersion, String jQueryVersion, String workDirPath, String staticDirPath) {
    download {
        src "https://codeload.github.com/almasaeed2010/AdminLTE/zip/v${adminLTEVersion}"
        dest new File("${workDirPath}/download/AdminLTE-${adminLTEVersion}.zip")
    }
    copy {
        from zipTree("${workDirPath}/download/AdminLTE-${adminLTEVersion}.zip")
        into "${workDirPath}/unzip"
    }
    copy {
        from "${workDirPath}/unzip/AdminLTE-${adminLTEVersion}/bootstrap/css"
        into "${staticDirPath}/css"
    }
    copy {
        from "${workDirPath}/unzip/AdminLTE-${adminLTEVersion}/bootstrap/fonts"
        into "${staticDirPath}/fonts"
    }
    copy {
        from "${workDirPath}/unzip/AdminLTE-${adminLTEVersion}/bootstrap/js"
        into "${staticDirPath}/js"
    }
    copy {
        from "${workDirPath}/unzip/AdminLTE-${adminLTEVersion}/dist/css"
        into "${staticDirPath}/css"
    }
    copy {
        from "${workDirPath}/unzip/AdminLTE-${adminLTEVersion}/dist/js"
        into "${staticDirPath}/js"
    }
    copy {
        from "${workDirPath}/unzip/AdminLTE-${adminLTEVersion}/plugins/jQuery/jQuery-${jQueryVersion}.min.js"
        into "${staticDirPath}/js"
    }
    delete "${staticDirPath}/js/pages"
    delete "${staticDirPath}/js/demo.js"
}

void downloadFontAwesome(String fontAwesomeVersion, String workDirPath, String staticDirPath) {
    download {
        src "http://fortawesome.github.io/Font-Awesome/assets/font-awesome-${fontAwesomeVersion}.zip"
        dest new File("${workDirPath}/download/font-awesome-${fontAwesomeVersion}.zip")
    }
    copy {
        from zipTree("${workDirPath}/download/font-awesome-${fontAwesomeVersion}.zip")
        into "${workDirPath}/unzip"
    }
    copy {
        from "${workDirPath}/unzip/font-awesome-${fontAwesomeVersion}/css/font-awesome.min.css"
        into "${staticDirPath}/css"
    }
    copy {
        from "${workDirPath}/unzip/font-awesome-${fontAwesomeVersion}/fonts"
        into "${staticDirPath}/fonts"
    }
}

void downloadIonicons(String ioniconsVersion, String workDirPath, String staticDirPath) {
    download {
        src "https://codeload.github.com/driftyco/ionicons/zip/v${ioniconsVersion}"
        dest new File("${workDirPath}/download/ionicons-${ioniconsVersion}.zip")
    }
    copy {
        from zipTree("${workDirPath}/download/ionicons-${ioniconsVersion}.zip")
        into "${workDirPath}/unzip"
    }
    copy {
        from "${workDirPath}/unzip/ionicons-${ioniconsVersion}/css/ionicons.min.css"
        into "${staticDirPath}/css"
    }
    copy {
        from "${workDirPath}/unzip/ionicons-${ioniconsVersion}/fonts"
        into "${staticDirPath}/fonts"
    }
}

void downloadHtml5shivJs(String html5shivJsVersion, String workDirPath, String staticDirPath) {
    download {
        src "https://oss.maxcdn.com/html5shiv/${html5shivJsVersion}/html5shiv.min.js"
        dest new File("${workDirPath}/download/html5shiv.min.js")
    }
    copy {
        from "${workDirPath}/download/html5shiv.min.js"
        into "${staticDirPath}/js"
    }
}

void downloadRespondMinJs(String respondMinJsVersion, String workDirPath, String staticDirPath) {
    download {
        src "https://oss.maxcdn.com/respond/${respondMinJsVersion}/respond.min.js"
        dest new File("${workDirPath}/download/respond.min.js")
    }
    copy {
        from "${workDirPath}/download/respond.min.js"
        into "${staticDirPath}/js"
    }
}

void downloadBootstrapFileInputMinJs(String workDirPath, String staticDirPath) {
    download {
        src "https://github.com/kartik-v/bootstrap-fileinput/zipball/master"
        dest new File("${workDirPath}/download/kartik-v-bootstrap-fileinput.zip")
    }
    copy {
        from zipTree("${workDirPath}/download/kartik-v-bootstrap-fileinput.zip")
        into "${workDirPath}/unzip"
    }
    copy {
        from "${workDirPath}/unzip/kartik-v-bootstrap-fileinput-883d8b6/js/fileinput.min.js"
        into "${staticDirPath}/js"
    }
    copy {
        from "${workDirPath}/unzip/kartik-v-bootstrap-fileinput-883d8b6/js/fileinput_locale_ja.js"
        into "${staticDirPath}/js"
    }
    copy {
        from "${workDirPath}/unzip/kartik-v-bootstrap-fileinput-883d8b6/css/fileinput.min.css"
        into "${staticDirPath}/css"
    }
}

def compareSrcAndTestDir(srcDir, excludePaths, excludeFileNamePatterns) {
    def existFlg
    def testDirAndTestClassNameList = [
            ["src/test/java", "Test.java"]
            , ["src/test/groovy", "Test.groovy"]
    ]

    for (srcFile in srcDir.listFiles()) {
        String srcFilePath = (srcFile.toPath() as String).replaceAll("\\\\", "/")
        existFlg = false

        for (exclude in excludePaths) {
            if (srcFilePath =~ /^${exclude as String}/) {
                existFlg = true
                break
            }
        }
        if (existFlg == true) continue

        for (exclude in excludeFileNamePatterns) {
            if (srcFilePath =~ /${exclude as String}/) {
                existFlg = true
                break
            }
        }
        if (existFlg == true) continue

        if (srcFile.isDirectory()) {
            compareSrcAndTestDir(srcFile, excludePaths, excludeFileNamePatterns)
        } else {
            def nextFlg = false
            for (testDirAndTestClassName in testDirAndTestClassNameList) {
                def testDir = testDirAndTestClassName[0]
                def testClassName = testDirAndTestClassName[1]

                String testFilePath = srcFilePath.replaceFirst(/^src\/main\/java/, testDir).replaceFirst(/\.java$/, testClassName)
                def testFile = new File(testFilePath)
                if (testFile.exists()) {
                    nextFlg = true
                    break
                }
            }
            if (nextFlg) continue

            println(srcFilePath);
        }
    }
}
  • Spring Boot のバージョンアップ対応として以下の点を変更します。
    • buildscript の以下の点を変更します。
      • springBootVersion = '1.3.5.RELEASE'springBootVersion = '1.4.4.RELEASE' に変更します。
      • classpath("io.spring.gradle:dependency-management-plugin:0.5.6.RELEASE")classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE") に変更します。dependency-management-plugin は 1.0.0.RELEASE が出ていますが、これと spring-boot-gradle-plugin を一緒に入れると動かないので今回は 0.6.1.RELEASE を使用します。
    • apply plugin: 'spring-boot'apply plugin: 'org.springframework.boot' に変更します。
    • dependencyManagement の以下の点を変更します。
      • mavenBom 'io.spring.platform:platform-bom:2.0.5.RELEASE'mavenBom 'io.spring.platform:platform-bom:Athens-SR3' に変更します。
  • ライブラリを最新バージョンにアップデートするために以下の点を変更します。
    • buildscript の以下の点を変更します。
      • classpath("org.ajoberstar:grgit:1.7.0")classpath("org.ajoberstar:grgit:1.8.0") に変更します。
      • classpath("de.undercouch:gradle-download-task:3.0.0")classpath("de.undercouch:gradle-download-task:3.2.0") に変更します。
    • dependencies の以下の点を変更します。
      • def jdbcDriver = "org.postgresql:postgresql:9.4.1208"def jdbcDriver = "org.postgresql:postgresql:9.4.1212" に変更します。
      • compile("org.seasar.doma:doma:2.8.0")compile("org.seasar.doma:doma:2.15.0") に変更します。
      • compile("org.apache.commons:commons-lang3:3.4")compile("org.apache.commons:commons-lang3:3.5") に変更します。
      • compile("org.projectlombok:lombok:1.16.8")compileOnly("org.projectlombok:lombok:1.16.12") に変更します。
      • compile("com.google.guava:guava:19.0")compile("com.google.guava:guava:21.0") に変更します。
      • compile("com.univocity:univocity-parsers:2.1.1")compile("com.univocity:univocity-parsers:2.3.1") に変更します。
      • compile("org.thymeleaf.extras:thymeleaf-extras-java8time:2.1.0.RELEASE")compile("org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.0.RELEASE") に変更します。
      • testCompile("org.dbunit:dbunit:2.5.1")testCompile("org.dbunit:dbunit:2.5.3") に変更します。
      • testCompile("com.icegreen:greenmail:1.5.0")testCompile("com.icegreen:greenmail:1.5.3") に変更します。
      • testCompile("org.assertj:assertj-core:3.4.1")testCompile("org.assertj:assertj-core:3.6.2") に変更します。
      • testCompile("org.jmockit:jmockit:1.23")testCompile("org.jmockit:jmockit:1.30") に変更します。
      • domaGenRuntime("org.seasar.doma:doma-gen:2.8.0")domaGenRuntime("org.seasar.doma:doma-gen:2.15.0") に変更します。
  • それ以外に以下の点を変更します。
    • compileJava.options.compilerArgs, compileTestGroovy.options.compilerArgs, compileTestJava.options.compilerArgs の3行を1行にして、-options,-processing を追加し、[compileJava, compileTestGroovy, compileTestJava]*.options*.compilerArgs = ['-Xlint:all,-options,-processing'] に変更します。
    • eclipse { ... } を削除します。
    • dependencies の以下の点を変更します。
      • testCompileOnly("org.projectlombok:lombok:1.16.12") を追加します。

■その2

sourceCompatibility = 1.8
targetCompatibility = 1.8

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
}
  • task wrapper(type: Wrapper) { gradleVersion = '2.13' } を追加します。

履歴

2017/02/11
初版発行。