Java

Gradleのユニットテストを早くするためにやったこと

プロジェクト管理ツールにGradleを使ったSpring Bootプロジェクトのユニットテストを、GitLab CIのパイプラインで実行しているが、完了するのに45分程度かかっていた。 その後のデプロイなど含めると、トータル1時間程度かかってしまう。 短縮できないか調べ…

静的解析結果をGitHubのPRやGitLabのMRにコメントするViolationsツールの紹介

静的解析ツールを導入しているが、事前に解析結果をチェックしてといってもなかなか潰しきれない。 GitサーバーとしてGitLabを使っているので、マージリクエスト(GitHubなどのプルリクエストに相当、以下MR)でコードレビューを行っているが、静的解析結果をM…

Java11にしてIntellijからGradleユニットテストを実行するとcompileTestGroovyでClassNotFoundExceptionが発生する

Java8からJava11にアップデートをしたところ、Intellijからテスト実行ができなくなった。 Git Bashから ./gradlew test したり、コマンドプロンプトから gradlew.bat test すると問題なく実行できるので、Intellij起因の問題だろうと思って調べたが、かなり…

Spring Data JPAのRepositoryでクエリを自動生成するためのメソッド命名規約

Spring Data JPAで、 JpaRepository を継承したリポジトリインターフェースに対し、特定の命名規則でメソッドを宣言しておくと、 @Query アノテーションなど書かなくても処理を自動生成してくれる。 で、その命名規則、単純な検索処理であれば findAllByXxxI…

Javadocから作成したXMLを読み込み、クラスと突き合わせてファイル出力してみる

typescript-generatorプラグインでJavadocからTSDocを生成したのち、XMLを直接読み込んだらいろいろできそうだなと思いついた。 Enumの値のJavadocと、フィールドで設定された値を出力したい場合があり、試してみたらできたのでメモ。 やりたいこと 実装例 J…

権限設定を実装するため、Javaで使える認可ライブラリについて調べた

アカウントまたはグループに権限設定して、もろもろの属性に応じたアクセス制御を行うことになった。 システム管理者が参照・作成・更新・削除といった権限を含むロールを作成 システム管理者がトップレベルのリソース(ルートディレクトリ的なもの)を作成 シ…

毎回忘れる海外の全文検索SaaSサービスの名前「Algolia」と、ざっくり全文検索サービス紹介

GitLabの全文検索に使われていたり、Firebaseの全文検索に推奨されている、SaaSの全文検索サービスの名前を毎回忘れるのでメモ。 Algolia です。 2021/3/28現在では、公式ページの利用会社ロゴにSlackがあるなぁ。 使ってみたとかではなく、全文検索の話題の…

typescript-generatorにプリミティブ型を必須プロパティ(non null)にするオプションが追加されていた

以前書いた記事の段階では、 typescript-generator で requiredAnnotations を指定すると、プリミティブ型のフィールド/GetterについてもOptional Properties(null設定可能)扱いとなっていた。 2021年3月の更新で、プリミティブ型をまとめて必須(非null)にで…

typescript-generatorプラグインでJavadocからTSDocを生成する

以前調査したtypescript-generator、その後もパラメーター調整しながら使用しているが、困ったのがヒアドキュメント。 Java側ではJavadocでクラスやプロパティの説明を書いているが、生成したTypeScriptのインターフェース定義ファイルにはデフォルトだと出…

フィールドやメソッドに付与されたRetentionPolicy.CLASSのアノテーションをJavassistで実行時に判定する

lombok.NonNull やKotlinの val をコンパイルすると付与される org.jetbrains.annotations.NotNull など、 RetentionPolicy.CLASS のアノテーションを実行時に判定したい場面があった。 RetentionPolicy.CLASS の場合は、 RetentionPolicy.RUNTIME のように…

GradleでコンパイルするJavaのバージョンを指定するときはJavaVersion列挙型が使える

小ネタ。 GradleでJavaのコンパイルするバージョンなどを指定する際、お決まりで apply plugin: 'java' sourceCompatibility = 1.8 targetCompatibility = '1.8' のように記述するが、ここに列挙型が使える。 ただ、毎回クラス名が何だったか忘れるのでメモ…

Kotlinのchunkedのように、Javaでサイズ/要素数によるList分割をするにはGuavaかCommons Collectionsを使えばいい

Kotlinの Iterable#chunked が便利だな~と思っていた矢先、JavaでListを複数のリストに分割する機会があった。 検索すると独自の実装方法が上位に出てくるが、たぶんCommons CollectionsかGuavaに用意されてるだろうと思ったら、両方にあったのでメモ。 Kot…

GaugeのJava実装を試してみる

前回の続き。 Taikoを使ったJavaScriptによるテスト実装でもろもろ躓いたので、Javaによるテスト実装を試してみる。 環境 JDKのバージョンについて プロジェクトの作成 pom.xmlの修正 Java実装 WebDriver用のヘルパークラス 実行フック データの保存 ステッ…

WindowsでGradleのbootRunがCreateProcess error=206になるときの対応方法と、Kotlinで記述している場合の注意点

開発端末がmacOSだけのプロジェクトに、ひとりWindowsでアサインされた。 プロジェクト管理がGradle、フレームワークがSpring Boot、開発言語がJavaまたはKotlinだったので、さっそく gradlew.bat bootRun すると、 A problem occurred starting process 'co…

GradleでprocessResources時にシンボリックリンクを作成(Windows, macOS対応)

Spring Bootを使ったJavaプロジェクトで、 bootRun をしてから起動するまで数分かかっていた。 調べてみると、 processResources タスクで src/main/webapp/WEB-INF を build/build/resources/main/WEB-INF にコピーしていたが、 src/main/webapp/WEB-INF 配…

Javaでinstanceofの代わりに使えるClassクラスのメソッドはisInstanceとisAssignableFromだというメモ

タイトル通り。 使おうと思うたびに「 instanceof 演算子の代わりに使えるメソッドなんだっけ?」となるのでメモ。 環境 それぞれの使い方 instanceof 演算子 Class#isInstance(Object) Class#isAssignableFrom(Class) 注意点 振り返り 環境 OpenJDK 8 8.262.…

JavaクラスからTypeScriptのインターフェース定義を生成するtypescript-generator Maven/Gradleプラグインを試してみた

フロントエンドをTypeScriptで記述することとなり、リクエストやレスポンスで受け渡すデータもTypeScriptで型定義したいという要望がでてきた。 バックエンドはSpring Bootを使ったJavaアプリケーションで、ダブルメンテになると面倒。 JavaのクラスからType…

javax.jws.WebParamなどがコンパイルエラーになったらJava 11に更新されているかもしれない

周囲に突然Javaアプリケーションのコンパイルがエラーになる人がちらほら。原因はシンプルだったが、意図せず発生していたためメモ。 問題 Spring Bootを利用したアプリケーションが、macOSのPCでコンパイルできなくなる事例が発生。 Controllerのメソッド引…

JavaのStream APIで任意のCollectionに変換する

JavaのStream APIでtoListした結果を、独自のListにaddAllしていたソースがあったので、 Collectors#toCollection でできるよ、と教える機会があった。 Collectors#collectingAndThen に比べて知名度が低いようなのでメモ。 collectingAndThen これは検索す…

Java正規表現のフラグ指定と埋込みフラグ表現

バグ修正をしていたところ、 java.util.regex.Pattern の埋込みフラグ表現が原因だった。 Java正規表現のフラグ指定や埋込みフラグ表現について、周囲に知っている人がいなかったのでメモ。 フラグ指定 Pattern.compile(String regex, int flags) で、指定し…

StringUtils#split(String, String)の仕様を勘違いしてハマった

Apache Commons Langの StringUtils#split(String, String) の挙動で地味にハマったのでメモ。 環境 Java 1.8.0_211、Apache Commons Lang 3.9にて確認。 状況 StringUtils#split(String, String) の第2引数にCRLFを渡すと、CRでもLFでも分割される。 import…

Javaでユニットテストを書く時のメモ

IDEやエディタにスニペットとして登録している、テスト記述時のテンプレートがあるが、最近他人の端末でコーディングする機会が多く、「あれ、どう書くんだっけ?」となることが多かったのでメモ。 環境 Rule パラメーター化テスト MockitoのdoReturn/whenとw…

JavaのModelMapperでLombokの@Value+@Builderを付けたクラスに変換する

Javaのクラス変換にModelMapperを使っているが、LombokのBuilderアノテーションを付与したクラスに対し、 ModelMapper#map メソッドを実行するとエラーが発生したので、対応方法をメモ。 環境 エラー発生状況 対応 調整 環境 ModelMapper v2.3.2 で確認。 エ…