Java9でJettyでJerseyのMaven
   2 min read

dependency について、2.3.2. Servlet based server-side applicationをみると最小構成はjersey-container-servletだけでいいように見える(Servlet3.0 以降の場合)が、実際にはjersey-hk2も必要。含めない場合次の例外が発生する。

java.lang.IllegalStateException: InjectionManagerFactory not found.

1.1. Creating a New Project from Maven Archetypeに記載されている archetype を使ってプロジェクトを生成してみても依存関係にちゃっかり入っている。

検索した感じ、バージョン 2.26(これを書いている時点での最新バージョン)以降の症状かも知れない。

<dependency>
  <groupId>org.glassfish.jersey.containers</groupId>
  <artifactId>jersey-container-servlet</artifactId>
  <version>${jersey.version}</version>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.inject</groupId>
  <artifactId>jersey-hk2</artifactId>
  <version>${jersey.version}</version>
</dependency>

次に、Java9 では Java EE 関連のモジュールがデフォルトではロードされなくなったため、Jersey を使った JAX-RS(REST)プログラムをmvn jetty:runで実行しようとすると次の例外が出る。

java.lang.NoClassDefFoundError: javax/activation/DataSource

また、次も発生。

java.lang.NoClassDefFoundError: javax/xml/bind/PropertyException

それぞれ解消するために --add-modules java.activation,java.xml.bind オプションを付与する。Maven で実行する場合は、 MAVEN_OPTS 環境変数に設定しておけばランタイム実行パラメータとなる。

マイグレーションガイドのModules Shared with Java EE Not Resolved by Defaultにある通り、--add-modules java.se.eeの方が簡単で覚えやすいかもしれない。

MAVEN_OPTS="--add-modules java.activation,java.xml.bind" mvn jetty:run