Java
jetty
jersey
Java9

Java9でJettyでJerseyのMaven

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