かんがるーさんの日記

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

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その103 )( Eclipse Adoptium OpenJDK(Eclipse Temurin)を 11.0.12+7 → 17+35 へバージョンアップする )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その102 )( SpotBugs を 4.0.2 → 4.4.1 へ、PMD を 6.23.0 → 6.39.0 へ、error-prone を 2.3.4 → 2.9.0 へバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Eclipse Adoptium OpenJDK(Eclipse Temurin)を 11.0.12+7 → 17+35 へバージョンアップします。

参照したサイト・書籍

  1. Internal JDK Elements Strongly Encapsulated in JDK 17
    https://www.infoq.com/news/2021/06/internals-encapsulated-jdk17/

  2. How to avoid "Sharing is only supported for boot loader classes because bootstrap classpath has been appended" warning during debug with Java 11?
    https://newbedev.com/how-to-avoid-sharing-is-only-supported-for-boot-loader-classes-because-bootstrap-classpath-has-been-appended-warning-during-debug-with-java-11

目次

  1. Eclipse Adoptium OpenJDK(Eclipse Temurin)を 11.0.12+7 → 17+35 へバージョンアップする
  2. configureChromeDriverBinary タスクで java.lang.reflect.InvocationTargetException が発生してタスクが失敗する原因を調査する。。。が、対応方法が分からないので com.github.erdi.webdriver-binaries Plugin を外す
  3. test タスクで Caused by: org.modelmapper.internal.ErrorsException ... が発生するので ModelMapper を最新バージョンに上げる

手順

Eclipse Adoptium OpenJDK(Eclipse Temurin)を 11.0.12+7 → 17+35 へバージョンアップする

IntelliJ IDEA のメインメニューから「File」-「Project Structure...」を選択し、「Project Structure」ダイアログが表示されたら「Project SDK」で「17+35」を選択して「OK」ボタンをクリックします。

f:id:ksby:20211015223606p:plain

メイン画面に戻ると画面右下に「Indexing...」の表示が出るので、終了するまで待ちます。

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

sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
  • JavaVersion.VERSION_11JavaVersion.VERSION_17 に変更します。

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

clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると configureChromeDriverBinary タスクで失敗して BUILD FAILED が出力されました。

f:id:ksby:20211015225835p:plain

  • compileTestJava タスクで以下の WARNING が出力される。
WARNING: A terminally deprecated method in java.lang.System has been called
WARNING: System::setSecurityManager has been called by edu.umd.cs.findbugs.ba.jsr305.TypeQualifierValue (file:/C:/Users/root/.gradle/caches/modules-2/files-2.1/com.github.spotbugs/spotbugs/4.4.1/d50cf49af9b5074d5ab3d0f89889d753623f341e/spotbugs-4.4.1.jar)
WARNING: Please consider reporting this to the maintainers of edu.umd.cs.findbugs.ba.jsr305.TypeQualifierValue
WARNING: System::setSecurityManager will be removed in a future release
  • configureChromeDriverBinary タスクで java.lang.reflect.InvocationTargetException が発生してタスクが失敗する。
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':configureChromeDriverBinary'.
> java.lang.reflect.InvocationTargetException

compileTestJava タスクの WARNING は SpotBugs が内部で System::setSecurityManager を呼び出しているのが原因のようなので、特に対応はせずにこのままとします。

ただし build.gradle を https://github.com/ksby/ksbysample-webapp-lending のものと比較して変更したい点があったので、以下のように変更します。

configurations {
    compileOnly.extendsFrom annotationProcessor

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

    // for SpotBugs
    spotbugsStylesheets { transitive = false }
}

..........

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

    // for SpotBugs
    spotbugs(configurations.spotbugsPlugins.dependencies)
    annotationProcessor("com.github.spotbugs:spotbugs-annotations:${spotbugs.toolVersion.get()}")
    spotbugsPlugins("com.h3xstream.findsecbugs:findsecbugs-plugin:1.11.0")

    ..........
}
  • configurations block の以下の点を変更します。
    • developmentOnly を削除します。
    • runtimeClasspath { extendsFrom developmentOnly }compileOnly.extendsFrom annotationProcessor に変更します。
  • dependencies block の以下の点を変更します。
    • compileOnly("com.github.spotbugs:spotbugs-annotations:${spotbugs.toolVersion.get()}")annotationProcessor("com.github.spotbugs:spotbugs-annotations:${spotbugs.toolVersion.get()}") に変更します。

configureChromeDriverBinary タスクで java.lang.reflect.InvocationTargetException が発生してタスクが失敗する原因を調査する。。。が、対応方法が分からないので com.github.erdi.webdriver-binaries Plugin を外す

build 時に --debug --stacktrace オプションを付けて実行し直してみます。

IntelliJ IDEA のメインメニューから「Run」-「Edit Configurations...」を選択して「Run/Debug Configurations」ダイアログを表示した後、「Gradle」-「boot-npm-geb-sample [build]」を選択後、画面右側の「Run」に --debug --stacktrace を追加します。

f:id:ksby:20211015234017p:plain

clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると Caused by: java.lang.IllegalAccessException: module jdk.proxy12 does not open jdk.proxy12 to unnamed module @1b604f19 が出力されました。

f:id:ksby:20211015234832p:plain

VM options に --add-opens=jdk.proxy12/jdk.proxy12=ALL-UNNAMED を指定してみます。

f:id:ksby:20211015235358p:plain f:id:ksby:20211016000107p:plain

clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると Caused by: java.lang.IllegalAccessException: module jdk.proxy4 does not open jdk.proxy4 to unnamed module @cb5822 が出力されたので、

f:id:ksby:20211016000636p:plain

VM options に --add-opens=jdk.proxy4/jdk.proxy4=ALL-UNNAMED を追加します。

f:id:ksby:20211016000831p:plain

clean タスク実行 → Rebuild Project 実行 → build タスクを実行しましたが、前と同じ Caused by: java.lang.IllegalAccessException: module jdk.proxy4 does not open jdk.proxy4 to unnamed module @cb5822 が出力されます。

f:id:ksby:20211016001405p:plain

これは Plugin の Java 17 対応待ちでしょうか。。。 対応方法が分からないので、今回は com.github.erdi.webdriver-binaries Plugin を外すことにします。

build.gradle で com.github.erdi.webdriver-binaries Plugin に関する記述をコメントアウトします。

plugins {
    id "java"
    id "groovy"
    id "eclipse"
    id "idea"
    id "org.springframework.boot" version "2.5.5"
    id "io.spring.dependency-management" version "1.0.11.RELEASE"
    id "net.ltgt.errorprone" version "2.0.2"
    id "checkstyle"
    id "com.github.spotbugs" version "4.7.7"
    id "pmd"
    id "com.github.node-gradle.node" version "3.1.1"
    id "com.gorylenko.gradle-git-properties" version "2.3.1"
// Java 17 で build タスクを実行すると java.lang.reflect.InvocationTargetException が発生し、
// 対応方法が不明なのでコメントアウトする
//    id "com.github.erdi.webdriver-binaries" version "2.6"
    id "org.seasar.doma.codegen" version "1.4.1"
}

..........

// Java 17 で build タスクを実行すると java.lang.reflect.InvocationTargetException が発生し、
// 対応方法が不明なのでコメントアウトする
//// https://github.com/webdriverextensions/webdriverextensions-maven-plugin-repository/blob/master/repository-3.0.json 参照
//webdriverBinaries {
//    chromedriver {
//        version = "94.0.4606.41"
//        architecture = "X86"
//        fallbackTo32Bit = true
//    }
//    geckodriver {
//        version = "0.29.1"
//        architecture = "X86_64"
//    }
//}
def drivers = ["chrome", "firefox"]
..........

またこのままでは WebDriver を認識できず gebTest タスクが成功しないので、src/test/resources/GebConfig.groovy の System.setProperty("webdriver.~ から始まる2行のコメントアウトを解除します。

System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.30.0/geckodriver.bat")
System.setProperty("webdriver.chrome.driver", "D:/chromedriver/94.0.4606.61/chromedriver.exe")
driver = {
    ChromeOptions chromeOptions = new ChromeOptions()
    new ChromeDriver(chromeOptions)
//    FirefoxOptions firefoxOptions = new FirefoxOptions()
//    new FirefoxDriver(firefoxOptions)
}
..........

build タスクに追加したオプションは全て削除します。

test タスクで Caused by: org.modelmapper.internal.ErrorsException ... が発生するので ModelMapper を最新バージョンに上げる

clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると、今度は test タスクでテストが大量に失敗しました。

f:id:ksby:20211017093537p:plain

失敗したテストでは Caused by: org.modelmapper.internal.ErrorsException at Errors.java:254 と出力されていました。

build.gradle では implementation("com.github.rozidan:modelmapper-spring-boot-starter:2.3.1") を指定するだけで ModelMapper のバージョンは明記しておらず、依存関係にある ModelMapper のバージョンを確認したところ 2.3.0 でしたので、最新バージョンの 2.4.4 を依存関係に追加してみることにします。

f:id:ksby:20211017094122p:plain

build.gradle に implementation("org.modelmapper:modelmapper:2.4.4") を追加します。

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

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    ..........
    implementation("com.github.rozidan:modelmapper-spring-boot-starter:2.3.1")
    implementation("org.modelmapper:modelmapper:2.4.4")
    implementation("com.google.guava:guava:31.0.1-jre")
    ..........

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

clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると無事 "BUILD SUCCESSFUL" が出力されました。

f:id:ksby:20211017095358p:plain

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended のメッセージは test タスクの jvmArgs に -Xshare:off オプションを指定すれば出力されなくなりますが、今のままにします。

gebTest タスクも問題ありませんでした。

f:id:ksby:20211017101430p:plain

履歴

2021/10/17
初版発行。