Grooy スクリプトをそのまま渡して実行する Spring Boot+Picocli ベースのコマンドラインアプリを作成する ( 大目次 )
GitHub は https://github.com/ksby/groovy-script-executor
- その1 ( 概要 )
- その2 ( groovy-script-executor.jar を作成する )
- その3 ( サンプルの Groovy スクリプトをプロジェクト内に置く+PostgreSQL、MySQL を起動するための docker-compose.yml を作成してデータベース・テーブルを作成する )
- その4 ( テーブルのデータを CSV フォーマットで出力する Groovy スクリプトを作成する )
- その5 ( CSV ファイルのデータをテーブルに登録する Groovy スクリプトを作成する )
- その6 ( Groovy スクリプトからログをコンソールやファイルに出力する )
- その7 ( @SpringBootApplication アノテーションを付与した Groovy スクリプトで SFTP クライアントを作成する )
- その8 ( @SpringBootApplication アノテーションを付与した Groovy スクリプトで REST API サーバを作成する )
- 番外編 ( ConEmu 上で WSL 2 の Ubuntu-20.04 の bash を起動する+Ubuntu-20.04 の別インスタンスを作成する )
- その9 ( Gradle を 7.2 → 7.3.3 へ、Spring Boot を 2.5.6 → 2.6.2 へバージョンアップする )
- その10 ( GraalVM で groovy-script-executor の Windows 版 Native Image を作成する )
Spring Boot 2.4.x の Web アプリを 2.5.x へバージョンアップする ( その15 )( JUnit 4 を依存関係から削除する+他3点の気づいた点を変更する )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- Spring Boot を 2.5系にバージョンアップしても JUnit 4 が依存関係に残ることに気づいたので除去します。
- IntelliJ IDEA で Rebuild Project した時に生成される out ディレクトリが Gradle の clean タスクを実行しても残ることに気づいたので削除されるようにします。
- Mockito.mockStatic を使用するテストでは try-with-resources 構文を使用してリソースが close されるようにしないといけないことに気づいたので修正します。
- JDK 17 がサポートされた Lombok 1.18.22 がリリースされていたのでバージョンアップします。
参照したサイト・書籍
How to exclude Gradle dependencies
https://tomgregory.com/how-to-exclude-gradle-dependencies/@StandardException annotation for generating exception constructors
https://github.com/projectlombok/lombok/pull/2702
目次
- 依存関係から JUnit 4 を除去する
- JUnit 4 のモジュールを利用しているクラスを変更・削除する
- src/test/java/ksbysample/common/test/extension/db/TestDataExtension.java
- src/test/java/ksbysample/common/test/extension/mail/MailServerExtension.java
- src/test/java/ksbysample/common/test/extension/mockmvc/SecurityMockMvcExtension.java
- src/test/java/ksbysample/common/test/helper/DescriptionWrapper.java
- src/test/groovy/ksbysample/webapp/lending/SampleHelperTest.groovy
- clean タスクで out ディレクトリが削除されるようにする
- Mockito.mockStatic を呼び出しているテストで try-with-resources 構文を使用してリソースが close されるようにする
- Lombok を 1.18.20 → 1.18.22 にバージョンアップする
- WebApplicationRuntimeException クラスを Lombok の @StandardException を利用して書き直す
- build タスクでエラーが出ないことを確認する
手順
依存関係から JUnit 4 を除去する
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その100 )( Gradle を 6.9.1 → 7.2 へ、Spring Boot を 2.4.10 → 2.5.4 へ、Geb を 4.1 → 5.0 へバージョンアップする2 ) の作業で Spring Boot を 2.5系にバージョンアップしても JUnit 4 が依存関係に残っていることに気づいたので、除去することにします。
今回は個々のモジュールに exclude を記述して除外するのではなく configurations block に exclude を記述する方法を採用します。build.gradle を以下のように変更します。
configurations { compileOnly.extendsFrom annotationProcessor // annotationProcessor と testAnnotationProcessor、compileOnly と testCompileOnly を併記不要にする testAnnotationProcessor.extendsFrom annotationProcessor testImplementation.extendsFrom compileOnly // JUnit 4 が依存関係に入らないようにする all { exclude group: "junit", module: "junit" } // for SpotBugs spotbugsStylesheets { transitive = false } }
all { exclude group: "junit", module: "junit" }
を追加します。
JUnit 4 のモジュールを利用しているクラスを修正する
src/test/java/ksbysample/common/test/extension/db/TestDataExtension.java
@Component public class TestDataExtension implements BeforeEachCallback, AfterEachCallback { .......... @Override public void beforeEach(ExtensionContext context) { before(new ExtensionContextWrapper(context)); } @Override public void afterEach(ExtensionContext context) { after(new ExtensionContextWrapper(context)); } ..........
extends TestWatcher
を削除します。- 以下のメソッドを削除します。
protected void starting(Description description) { ... }
protected void finished(Description description) { ... }
src/test/java/ksbysample/common/test/extension/mail/MailServerExtension.java
@Component public class MailServerExtension implements BeforeEachCallback, AfterEachCallback { private GreenMail greenMail = new GreenMail(new ServerSetup(25, "localhost", ServerSetup.PROTOCOL_SMTP)); @Override public void beforeEach(ExtensionContext context) { greenMail.start(); } @Override public void afterEach(ExtensionContext context) { greenMail.stop(); } ..........
extends ExternalResource
を削除します。- 以下のメソッドを削除します。
protected void before() { ... }
protected void after() { ... }
- beforeEach メソッド内の
before();
→greenMail.start();
に変更します。 - afterEach メソッド内の
after();
→greenMail.stop();
に変更します。
src/test/java/ksbysample/common/test/extension/mockmvc/SecurityMockMvcExtension.java
@Component @ConditionalOnWebApplication public class SecurityMockMvcExtension implements BeforeEachCallback { .......... @Override public void beforeEach(ExtensionContext context) { // 認証ユーザ用MockMvc ( user = tanaka.taro@sample.com ) UserDetails userDetailsTanakaTaro = userDetailsService.loadUserByUsername(MAILADDR_TANAKA_TARO); this.authTanakaTaro = MockMvcBuilders.webAppContextSetup(this.context) .defaultRequest(get("/").with(user(userDetailsTanakaTaro))) .apply(springSecurity()) .build(); // 認証ユーザ用MockMvc ( user = suzuki.hanako@test.co.jp ) UserDetails userDetailsSuzukiHanako = userDetailsService.loadUserByUsername(MAILADDR_SUZUKI_HANAKO); this.authSuzukiHanako = MockMvcBuilders.webAppContextSetup(this.context) .defaultRequest(get("/").with(user(userDetailsSuzukiHanako))) .apply(springSecurity()) .build(); // 認証ユーザ用MockMvc ( user = ito.aoi@test.co.jp ) UserDetails userDetailsItoAoi = userDetailsService.loadUserByUsername(MAILADDR_ITO_AOI); this.authItoAoi = MockMvcBuilders.webAppContextSetup(this.context) .defaultRequest(get("/").with(user(userDetailsItoAoi))) .apply(springSecurity()) .build(); // 非認証ユーザ用MockMvc this.noauth = MockMvcBuilders.webAppContextSetup(this.context) .apply(springSecurity()) .build(); } }
extends ExternalResource
を削除します。- before メソッド内のコードを beforeEach メソッドへ移動します。
- 以下のメソッドを削除します。
protected void before() { ... }
src/test/java/ksbysample/common/test/helper/DescriptionWrapper.java
このファイルは使用されなくなったので削除します。
src/test/groovy/ksbysample/webapp/lending/SampleHelperTest.groovy
@RunWith(Enclosed)
が記述されていたので削除します。
clean タスクで out ディレクトリが削除されるようにする
build.gradle の clean block を以下のように変更します。
clean { doLast { rootProject.file("out").deleteDir() rootProject.file("src/main/generated").deleteDir() rootProject.file("src/test/generated_tests").deleteDir() } }
rootProject.file("out").deleteDir()
を追加します。
Mockito.mockStatic を呼び出しているテストで try-with-resources 構文を使用してリソースが close されるようにする
src/test/groovy/ksbysample/webapp/lending/SampleHelperTest.groovy で以下のように書いているテストを、
@SpringBootTest static class 異常処理のテスト { @Autowired private SampleHelper sampleHelper @Test void "SampleHelper_encryptを呼ぶとRuntimeExceptionをthrowする"() { // setup: Mockito.mockStatic(BrowfishUtils) Mockito.when(BrowfishUtils.encrypt(Mockito.any())) .thenThrow(new NoSuchPaddingException()) // expect: assertThatThrownBy(() -> { sampleHelper.encrypt("test") }).isInstanceOf(RuntimeException) } }
try-with-resources 構文を使用してリソースが close されるよう書き直します。
@SpringBootTest static class 異常処理のテスト { @Autowired private SampleHelper sampleHelper @Test void "SampleHelper_encryptを呼ぶとRuntimeExceptionをthrowする"() { try (MockedStatic mockedBrowfishUtils = Mockito.mockStatic(BrowfishUtils)) { // setup: Mockito.when(BrowfishUtils.encrypt(Mockito.any())) .thenThrow(new NoSuchPaddingException()) // expect: assertThatThrownBy(() -> { sampleHelper.encrypt("test") }).isInstanceOf(RuntimeException) } } }
Lombok を 1.18.20 → 1.18.22 にバージョンアップする
IntelliJ IDEA で build.gradle を見ていたら org.projectlombok:lombok:
のところの色が変わっていて、マウスオーバーすると 1.8.22 がリリースされていることが分かりました。Alt+Enter を押すとバージョンも書き替えることも出来ます。この機能、すごい便利じゃないですか。。。
https://projectlombok.org/changelog を見ると v1.18.22 で PLATFORM: JDK17 support added. とのことなので、バージョンアップします。
build.gradle の以下の点を変更します。
dependencies { def spockVersion = "2.0-groovy-3.0" def jdbcDriver = "org.postgresql:postgresql:42.2.24" def domaVersion = "2.49.0" def lombokVersion = "1.18.22" def errorproneVersion = "2.9.0" ..........
def lombokVersion = "1.18.20"
→def lombokVersion = "1.18.22"
に変更します。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
WebApplicationRuntimeException クラスを Lombok の @StandardException を利用して書き直す
https://projectlombok.org/changelog の v1.18.22 のところを見ると @StandardException というアノテーションが追加されたとの記載があり、https://github.com/projectlombok/lombok/pull/2702 を見ると Exception クラスを継承して作成する時の基本的なコンストラクタを4つ自動生成してくれるとのこと。
便利そうなので WebApplicationRuntimeException クラスを @StandardException を利用して書き直してみます。
src/main/java/ksbysample/webapp/lending/exception/WebApplicationRuntimeException.java は現在以下のように実装していますが、
package ksbysample.webapp.lending.exception; public class WebApplicationRuntimeException extends RuntimeException { @SuppressWarnings("PMD.FieldNamingConventions") private static final long serialVersionUID = 3845674924872653036L; public WebApplicationRuntimeException() { super(); } public WebApplicationRuntimeException(String message) { super(message); } public WebApplicationRuntimeException(String message, Throwable cause) { super(message, cause); } public WebApplicationRuntimeException(Throwable cause) { super(cause); } }
@StandardException を利用して書き直すと以下のようになります。@SuppressWarnings("PMD.FieldNamingConventions")
も build 時に PMD が警告を出さないことに気づいたので削除します。
package ksbysample.webapp.lending.exception; import lombok.experimental.StandardException; import java.io.Serial; @StandardException public class WebApplicationRuntimeException extends RuntimeException { @Serial private static final long serialVersionUID = 3845674924872653036L; }
build タスクでエラーが出ないことを確認する
最後に clean タスク実行 → Rebuild Project 実行 → build タスクを実行して、"BUILD SUCCESSFUL" のメッセージが出力されることを確認します。
履歴
2021/10/20
初版発行。
IntelliJ IDEA を 2021.2.2 → 2021.2.3 へ、Git for Windows を 2.33.0.2 → 2.33.1 へバージョンアップ
IntelliJ IDEA を 2021.2.2 → 2021.2.3 へバージョンアップする
IntelliJ IDEA の 2021.2.3 がリリースされているのでバージョンアップします。
- IntelliJ IDEA 2021.2.3 is Available
https://blog.jetbrains.com/idea/2021/10/intellij-idea-2021-2-3/
※ksbysample-webapp-lending プロジェクトを開いた状態でバージョンアップしています。
IntelliJ IDEA のメインメニューから「Help」-「Check for Updates...」を選択します。
「IntelliJ IDEA and Plugin Updates」ダイアログが表示されます。右下に「Update and Restart」ボタンが表示されていますので、「Update and Restart」ボタンをクリックします。
Plugin の update も表示されました。このまま「Update」ボタンをクリックします。
Patch がダウンロードされて IntelliJ IDEA が再起動します。
IntelliJ IDEA が起動すると画面下部に「Indexing」のメッセージが表示されますので、終了するまで待機します(今回はかなり時間がかかりました)。
IntelliJ IDEA のメインメニューから「Help」-「About」を選択し、2021.2.3 へバージョンアップされていることを確認します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行して、"BUILD SUCCESSFUL" のメッセージが出力されることを確認します。
Project Tool Window で src/test でコンテキストメニューを表示して「More Run/Debug」-「Run 'All Tests' with Coverage」を選択し、テストが全て成功することを確認します。
Git for Windows を 2.33.0.2 → 2.33.1 へバージョンアップする
Git for Windows の 2.33.1 がリリースされていたのでバージョンアップします。
https://gitforwindows.org/ の「Download」ボタンをクリックして Git-2.33.1-64-bit.exe をダウンロードします。
Git-2.33.1-64-bit.exe を実行します。
「Git 2.33.1 Setup」ダイアログが表示されます。インストーラーの画面を一通り見たいので「Only show new options」のチェックを外してから [Next >] ボタンをクリックします。
「Select Components」画面が表示されます。「Git LFS(Large File Support)」だけチェックした状態で [Next >]ボタンをクリックします。
「Choosing the default editor used by Git」画面が表示されます。「Use Vim (the ubiquitous text editor) as Git's default editor」が選択された状態で [Next >]ボタンをクリックします。
「Adjusting the name of the initial branch in new repositories」画面が表示されます。「Let Git decide」が選択されていることを確認後、[Next >]ボタンをクリックします。
「Adjusting your PATH environment」画面が表示されます。中央の「Git from the command line and also from 3rd-party software」が選択されていることを確認後、[Next >]ボタンをクリックします。
「Choosing the SSH executable」画面が表示されます。「Use bundled OpenSSL」が選択されていることを確認後、[Next >]ボタンをクリックします。
「Choosing HTTPS transport backend」画面が表示されます。「Use the OpenSSL library」が選択されていることを確認後、[Next >]ボタンをクリックします。
「Configuring the line ending conversions」画面が表示されます。一番上の「Checkout Windows-style, commit Unix-style line endings」が選択されていることを確認した後、[Next >]ボタンをクリックします。
「Configuring the terminal emulator to use with Git Bash」画面が表示されます。「Use Windows'default console window」が選択されていることを確認した後、[Next >]ボタンをクリックします。
「Choose the default behavior of
git pull
」画面が表示されます。「Default (fast-forward or merge)」が選択されていることを確認した後、[Next >]ボタンをクリックします。「Choose a credential helper」画面が表示されます。「None」が選択されていることを確認した後、[Next >]ボタンをクリックします。
「Configuring extra options」画面が表示されます。「Enable file system caching」だけがチェックされていることを確認した後、[Next >]ボタンをクリックします。
「Configuring experimental options」画面が表示されます。何もチェックせずに [Install]ボタンをクリックします。
インストールが完了すると「Completing the Git Setup Wizard」のメッセージが表示された画面が表示されます。中央の「View Release Notes」のチェックを外した後、[Next >]ボタンをクリックしてインストーラーを終了します。
コマンドプロンプトを起動して
git --version
を実行し、git のバージョンがgit version 2.33.1.windows.1
になっていることを確認します。特に問題はないようですので、2.33.1 で作業を進めたいと思います。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その104 )( Checkstyle を 8.32 → 9.0.1 へバージョンアップする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- Checkstyle を 8.32 → 9.0.1 へバージョンアップします。
参照したサイト・書籍
目次
手順
Checkstyle を 8.32 → 9.0.1 へバージョンアップする
build.gradle の以下の点を変更します。
checkstyle { configFile = file("${rootProject.projectDir}/config/checkstyle/google_checks.xml") toolVersion = "9.0.1" sourceSets = [project.sourceSets.main] }
toolVersion = "8.32"
→toolVersion = "9.0.1"
に変更します。
https://github.com/ksby/ksbysample-webapp-lending/blob/master/config/checkstyle/google_checks.xml をコピーして config/checkstyle/google_checks.xml に上書きします。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると checkstyleMain タスクで警告が 10件出力されました。全て Javadoc コメントがありません。 [MissingJavadocType]
で @interface と enum のクラスコメントがない箇所で出力されていたので、警告が出た箇所に Javadoc のコメントを追加します。
再度 clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると今度は警告なしで "BUILD SUCCESSFUL" が出力されました。
履歴
2021/10/19
初版発行。
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
初版発行。
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 へバージョンアップする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- SpotBugs を 4.0.2 → 4.4.1 へ、PMD を 6.23.0 → 6.39.0 へ、error-prone を 2.3.4 → 2.9.0 へバージョンアップします。
- Checkstyle は今回はバージョンアップしません。JDK 17 へバージョンアップした時にエラーが出なかったのと、Record の設定が反映された https://github.com/ksby/ksbysample-webapp-lending/blob/master/config/checkstyle/google_checks.xml のファイルをコピーしたいためです。JDK 17 バージョンアップ後にバージョンアップします。
参照したサイト・書籍
目次
- SpotBugs を 4.0.2 → 4.4.1 へバージョンアップする
- PMD を 6.23.0 → 6.39.0 へバージョンアップする
- error-prone を 2.3.4 → 2.9.0 へバージョンアップする
手順
SpotBugs を 4.0.2 → 4.4.1 へバージョンアップする
build.gradle の以下の点を変更します。
plugins { .......... id "com.github.spotbugs" version "4.7.7" .......... } .......... spotbugs { toolVersion = "${spotbugs.toolVersion.get()}" ignoreFailures = true spotbugsTest.enabled = false excludeFilter = file("${rootProject.projectDir}/config/spotbugs/exclude.xml") } spotbugsMain { reports { html { enabled = true } } } .......... 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") .......... }
- plugins block の以下の点を変更します。
id "com.github.spotbugs" version "4.0.8"
→id "com.github.spotbugs" version "4.7.7"
- プラグインのバージョンを 4.7.7 にすることで SpotBugs のバージョンが 4.4.1 になります。SpotBugs version mapping 参照。
- spotbugs block の以下の点を変更します。
toolVersion = "4.0.2"
→toolVersion = "${spotbugs.toolVersion.get()}"
excludeFilter = file("${rootProject.projectDir}/config/spotbugs/exclude.xml")
を追加します。
- spotbugsMain block の以下の点を変更します。
stylesheet = "color.xsl"
を削除します。
- dependencies block の以下の点を変更します。
def spotbugsVersion = "4.0.2"
を削除します。- 以下の行を削除します。
compileOnly("com.github.spotbugs:spotbugs:${spotbugsVersion}") { exclude group: "pull-parser", module: "pull-parser" }
compileOnly("net.jcip:jcip-annotations:1.0")
compileOnly("com.github.spotbugs:spotbugs-annotations:${spotbugsVersion}")
testImplementation("com.google.code.findbugs:jsr305:3.0.2")
spotbugsStylesheets("com.github.spotbugs:spotbugs:${spotbugsVersion}")
- 以下の行を追加します。
spotbugs(configurations.spotbugsPlugins.dependencies)
compileOnly("com.github.spotbugs:spotbugs-annotations:${spotbugs.toolVersion.get()}")
spotbugsPlugins("com.h3xstream.findsecbugs:findsecbugs-plugin:1.10.1")
→spotbugsPlugins("com.h3xstream.findsecbugs:findsecbugs-plugin:1.11.0")
config ディレクトリの下に spotbugs ディレクトリを新規作成し、https://github.com/ksby/ksbysample-webapp-lending/blob/master/config/spotbugs/exclude.xml をコピーします。
Gradle Tool Window の左上にある「Reload All Gradle Projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると "BUILD SUCCESSFUL" のメッセージが出力されました。
PMD を 6.23.0 → 6.39.0 へバージョンアップする
build.gradle の以下の点を変更します。
pmd { toolVersion = "6.39.0" sourceSets = [project.sourceSets.main] ignoreFailures = true consoleOutput = true ruleSetFiles = rootProject.files("/config/pmd/pmd-project-rulesets.xml") ruleSets = [] }
toolVersion = "6.23.0"
→toolVersion = "6.39.0"
に変更します。
Gradle Tool Window の左上にある「Reload All Gradle Projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると PMD で警告が出ました。
レポートファイルを開くと警告は全部で 3種類、7箇所でした。
Logger calls should be surrounded by log level guards.
は https://ksby.hatenablog.com/entry/2021/09/03/211111#2-1 で対応したように config/pmd/pmd-project-rulesets.xml に設定を追加して、trace, debug のログ出力だけこのチェックが実行されるようにします。
<rule ref="category/java/bestpractices.xml"> <!-- CommentRequired はここでは exclude し、下で別途定義する --> <exclude name="GuardLogStatement"/> </rule> <rule ref="category/java/bestpractices.xml/GuardLogStatement"> <properties> <property name="logLevels" value="trace,debug"/> <property name="guardsMethods" value="isTraceEnabled,isDebugEnabled"/> </properties> </rule>
The initializer for variable 'selectOptions' is never used (overwritten on lines 22 and 24)
は SelectOptions selectOptions = null;
→ SelectOptions selectOptions;
に変更します。
SelectOptions selectOptions; if (countFlg) { selectOptions = SelectOptions.get().offset(offset).limit(limit).count(); } else { selectOptions = SelectOptions.get().offset(offset).limit(limit); }
The method 'checkTelAndEmail(boolean, String, String, String, String, Errors)' has a cognitive complexity of 20, current threshold is 15
は InquiryInput02FormValidator#checkTelAndEmail のメソッドが複雑なので警告が出ているのですが、今回はメソッドに @SuppressWarnings("PMD.CognitiveComplexity") を付与して警告が出ないようにします。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると無事 "BUILD SUCCESSFUL" のメッセージが出力されました。
error-prone を 2.3.4 → 2.9.0 へバージョンアップする
build.gradle の以下の点を変更します。
plugins { .......... id "net.ltgt.errorprone" version "2.0.2" .......... } .......... dependencies { .......... def errorproneVersion = "2.9.0" .......... // for Error Prone ( http://errorprone.info/ ) errorprone("com.google.errorprone:error_prone_core:${errorproneVersion}") compileOnly("com.google.errorprone:error_prone_annotations:${errorproneVersion}")
- plugins block の以下の点を変更します。
id "net.ltgt.errorprone" version "1.1.1"
→id "net.ltgt.errorprone" version "2.0.2"
- dependencies block の以下の点を変更します。
def errorproneVersion = "2.3.4"
→def errorproneVersion = "2.9.0"
Gradle Tool Window の左上にある「Reload All Gradle Projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると compileJava タスクで大量にエラーが出ました。1つずつ解消します。
https://errorprone.info/bugpattern/SameNameButDifferent は Lombok の @Slf4j、@Data アノテーションを付与している箇所で出力されていました。build.gradle を変更して出力されないようにします。https://ksby.hatenablog.com/entry/2021/03/03/210210#2-1 参照。
[compileJava, compileTestGroovy, compileTestJava]*.options*.encoding = "UTF-8" [compileJava, compileTestGroovy, compileTestJava]*.options*.compilerArgs = ["-Xlint:all,-options,-processing,-path"] tasks.withType(JavaCompile).configureEach { options.errorprone { disableWarningsInGeneratedCode = true disable("SameNameButDifferent") } }
disable("SameNameButDifferent")
を追加します。
https://google.github.io/styleguide/javaguide.html#s7.1.3-javadoc-block-tags は Javadoc で @throws、@return の説明文を記述していなかったのが原因でした。@throws、@return に説明文を追加します。https://ksby.hatenablog.com/entry/2020/08/20/002645#2-1 参照。
https://google.github.io/styleguide/javaguide.html#s7.2-summary-fragment は Javadoc に summary fragment がない箇所で出力されていました。summary fragment を記述します。What is a Javadoc summary fragment? 参照。
https://errorprone.info/bugpattern/ReturnValueIgnored は flatMap メソッドの戻り値を元のメソッドで使用していないことが原因でした。@SuppressWarnings("ReturnValueIgnored") を付与してエラーにならないようにします。https://ksby.hatenablog.com/entry/2021/09/04/205832#2-1 参照。
https://errorprone.info/bugpattern/InvalidInlineTag は Javadoc で {@Clob}
と記述していた箇所で出力されていました。{@link Clob}
のように修正します。
以上で error-prone が出力しているエラー・警告に対応したので再度 clean タスク実行 → Rebuild Project 実行 → build タスクを実行したところ、今度は PMD が 1種類、3箇所で警告を出力していました。
Comment is too large: Too many lines
は Javadoc の行数が 6行を超えていると出力されていました。https://github.com/ksby/ksbysample-webapp-lending/blob/master/config/pmd/pmd-project-rulesets.xml を見たところ、こちらでは <exclude name="CommentSize"/>
を記述してチェックしないようにしていたので、このファイルをコピーすることにします。
再度 clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると無事 "BUILD SUCCESSFUL" のメッセージが出力されました。
履歴
2021/10/14
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その101 )( Spring Boot を 2.5.4 → 2.5.5 へバージョンアップするが、Eclipse Adoptium OpenJDK(Eclipse Temurin)を 11.0.12+7 → 17+35 へバージョンアップするのは一旦諦める )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
参照したサイト・書籍
目次
- Spring Boot を 2.5.4 → 2.5.5 へバージョンアップする
- Eclipse Adoptium OpenJDK(Eclipse Temurin) を 11.0.12+7 → 17+35 へバージョンアップする。。。のは一旦諦める
手順
Spring Boot を 2.5.4 → 2.5.5 へバージョンアップする
build.gradle の以下の点を変更します。
buildscript { ext { group "ksbysample" version "2.5.5" } repositories { mavenCentral() gradlePluginPortal() } dependencies { // for doma-codegen-plugin classpath "com.h2database:h2:1.4.200" } } 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 "1.1.1" id "checkstyle" id "com.github.spotbugs" version "4.0.8" id "pmd" id "com.github.node-gradle.node" version "3.1.1" id "com.gorylenko.gradle-git-properties" version "2.3.1" id "com.github.erdi.webdriver-binaries" version "2.6" id "org.seasar.doma.codegen" version "1.4.1" }
Spring Boot 2.5.5 へのバージョンアップとして以下の点を変更します。
- buildscript block の以下の点を変更します。
version "2.5.4"
→version "2.5.5"
- plugins block の以下の点を変更します。
id "org.springframework.boot" version "2.5.4"
→id "org.springframework.boot" version "2.5.5"
Gradle Tool Window の左上にある「Reload All Gradle Projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると test タスクで大量にテストが失敗しました。
失敗したテストを確認すると、全てのテストで Caused by: org.xml.sax.SAXNotRecognizedException at Driver.java:178
が出力されてました。
InquiryMailHelperTest > 全ての項目に値がセットされている場合のテスト FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132 Caused by: java.lang.IllegalStateException at LoggingApplicationListener.java:328 Caused by: java.lang.IllegalStateException at LogbackLoggingSystem.java:168 Caused by: ch.qos.logback.core.joran.spi.JoranException at SaxEventRecorder.java:89 Caused by: org.xml.sax.SAXNotRecognizedException at Driver.java:178
失敗しているテストを 1つ IntelliJ IDEA から実行すると同様に失敗して、
この時出力されているログを見ると以下の出力があり、
.......... 15:07:38,542 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 15:07:38,542 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 15:07:38,543 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/project-springboot/ksbysample-boot-miscellaneous/boot-npm-geb-sample/out/test/resources/logback.xml] 15:07:38,706 |-ERROR in ch.qos.logback.core.joran.event.SaxEventRecorder@44c79f32 - Parser configuration error occurred org.xml.sax.SAXNotRecognizedException: unrecognized feature http://xml.org/sax/features/external-general-entities ..........
out/test/resources/logback.xml に問題がある模様。ファイルを開いてみると以下の内容でした。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- Geb+Spock で Firefox を headless モードで動かした時に大量に以下の DEBUG ログ が出力されるのを抑制するために作成しているファイルである。ファイルがあればログを抑 制できるので、特に logger の定義は記述していない。 [Forwarding ... on session ... to remote] DEBUG org.apache.http --> </configuration>
実際のファイルは src/test/resources/logback.xml なので、このファイルを削除してみます。
再び clean タスク実行。。。してみましたが、out ディレクトリを削除してくれないことに気づきました。clean タスクで out ディレクトリと、ついでに src/main/generated、src/test/generated_tests ディレクトリを削除するよう build.gradle に設定を追加します。
bootRun { jvmArgs = jvmArgsForTask + [ "-Dspring.profiles.active=develop", "-XX:TieredStopAtLevel=1" ] } clean { doLast { rootProject.file("out").deleteDir() rootProject.file("src/main/generated").deleteDir() rootProject.file("src/test/generated_tests").deleteDir() } }
再度 clean タスク実行 → Rebuild Project 実行 → build タスクを実行してみましたが、test タスクで大量にテストが失敗する状況が変わりません。
src/test/resources/logback.xml を削除しましたが、関係ないようなので元に戻します。
Web でいろいろ検索してみるとなぜか珍しく自分の過去の記事の Spring Boot 2.2.x の Web アプリを 2.3.x へバージョンアップする ( その2 )( Spring Boot を 2.2.2 → 2.2.9 へ、Gradle を 6.0.1 → 6.5.1 へバージョンアップする ) がヒットしました。この時は org.xml.sax.SAXNotSupportedException: not supported setting property http://xml.org/sax/properties/lexical-handler
というエラーでしたが、SpotBugs の依存関係から pull-parser を削除して解決しています。
今回は Parser configuration error occurred org.xml.sax.SAXNotRecognizedException: unrecognized feature http://xml.org/sax/features/external-general-entities
というエラーが出て失敗していますが、同じ原因のような気がするので SpotBugs の依存関係から pull-parser を削除してみます。
build.gradle を以下のように変更します。
dependencies { .......... // for SpotBugs compileOnly("com.github.spotbugs:spotbugs:${spotbugsVersion}") { exclude group: "pull-parser", module: "pull-parser" } ..........
exclude group: "pull-parser", module: "pull-parser"
を追加します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると "BUILD SUCCESSFUL" のメッセージが出力されました。
2.5.4 までは問題なかったのに 2.5.5 でエラーになったのかは謎です。。。
Eclipse Adoptium OpenJDK(Eclipse Temurin) を 11.0.12+7 → 17+35 へバージョンアップする。。。のは一旦諦める
Eclipse Adoptium OpenJDK(Eclipse Temurin)の 17+35 は Spring Boot 2.4.x の Web アプリを 2.5.x へバージョンアップする ( その13 )( Spring Boot を 2.5.4 → 2.5.5 へ、Eclipse Adoptium OpenJDK(Eclipse Temurin) を 11.0.12+7 → 17+35 へバージョンアップする ) でインストール済なので、プロジェクトで使用する JDK の設定を変更します。
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 タスクを実行すると compileJava タスクが error-prone が原因でエラーになるので、一旦 build.gradle の error-prone の設定を全てコメントアウトします(後でバージョンアップして解消する予定)。
再度 clean タスク実行 → Rebuild Project 実行 → build タスクを実行しますが、今度は spotBugsMain タスクが大量にログを出力し、configureChromeDriverBinary タスクでエラーになりました。
SpotBugs や error-prone をバージョンアップしてから JDK 17 にバージョンアップした方が良さそうな気がしたので、今回は JDK 11 に切り戻すことにします。
切り戻してから clean タスク実行 → Rebuild Project 実行 → build タスクを実行して "BUILD SUCCESSFUL" のメッセージが出力されることを確認しておきます。
Spring Boot のバージョンアップや JDK 17 へのバージョンアップは難しくないイメージがあったのですが、今回は結構辛いです。。。 バージョンアップはこまめにやった方がいいな、というのが正直な感想です。
履歴
2021/10/12
初版発行。