Spring Boot + npm + Geb で入力フォームを作ってテストする ( その103 )( Eclipse Adoptium OpenJDK(Eclipse Temurin)を 11.0.12+7 → 17+35 へバージョンアップする )
概要
記事一覧はこちらです。
参照したサイト・書籍
Internal JDK Elements Strongly Encapsulated in JDK 17
https://www.infoq.com/news/2021/06/internals-encapsulated-jdk17/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
目次
- Eclipse Adoptium OpenJDK(Eclipse Temurin)を 11.0.12+7 → 17+35 へバージョンアップする
- configureChromeDriverBinary タスクで java.lang.reflect.InvocationTargetException が発生してタスクが失敗する原因を調査する。。。が、対応方法が分からないので com.github.erdi.webdriver-binaries Plugin を外す
- 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」ボタンをクリックします。

メイン画面に戻ると画面右下に「Indexing...」の表示が出るので、終了するまで待ちます。
build.gradle の以下の点を変更します。
sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17
JavaVersion.VERSION_11→JavaVersion.VERSION_17に変更します。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると configureChromeDriverBinary タスクで失敗して BUILD FAILED が出力されました。

- 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 を追加します。

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

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

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

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

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

これは 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 タスクでテストが大量に失敗しました。

失敗したテストでは 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 を依存関係に追加してみることにします。

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" が出力されました。

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 タスクも問題ありませんでした。

履歴
2021/10/17
初版発行。