Jerseyライブラリを使用して起動するときに、次のような例外が発生することはないでしょうか。
java.lang.IllegalStateException: InjectionManagerFactory not found.
この例外は、Jerseyライブラリのバージョン2.26以降を使用している場合に発生する可能性があります。
今回は、この問題が発生する原因と解決方法を紹介していきます。
環境
検証に使用した環境/ライブラリを以下に記載します。
- Java
- Version:8
- Jersey
- Version:2.31
- Gradle
- Version:6.3
ビルドスクリプト
検証に使用したビルドスクリプトを次に記載します。
plugins {
id 'java'
}
sourceCompatibility = '8'
targetCompatibility = '8'
compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'
repositories {
jcenter()
}
dependencies {
implementation 'org.glassfish.jersey.containers:jersey-container-servlet:2.31'
}
原因
原因は、Jerseyライブラリのバージョン2.26から、内部処理で使用しているインジェクションフレームワークを別ライブラリとして独立した形式に変更する修正が行われているためです。
この修正により、今までのビルドスクリプトの指定方法では、インジェクションフレームワークに関連するライブラリが存在しないことになり、インジェクション関連の例外が発生するようになっています。
公式サイトのリリースノートに、この修正に関連する内容についての記載があります。
解決方法
解決方法は、ビルドスクリプトにインジェクションフレームワークを指定することです。ビルドスクリプトに次のライブラリを指定することで問題を解決することができます。
implementation 'org.glassfish.jersey.inject:jersey-hk2:2.31'
指定した内容は、公式サイトのリリースノートに記載されている方法になります。
最終的には次のようなビルドスクリプトになります。dependenciesにjersey-hk2の指定を追加しています。
plugins {
id 'java'
}
sourceCompatibility = '8'
targetCompatibility = '8'
compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'
repositories {
jcenter()
}
dependencies {
implementation 'org.glassfish.jersey.containers:jersey-container-servlet:2.31'
implementation 'org.glassfish.jersey.inject:jersey-hk2:2.31'
}
まとめ
Jerseyのマイナーバージョンアップにより、別ライブラリが必要となります。