Glassfish4.0.1+jerseyでCDIエラー
最初に
まず、jersey-mvc-freemarkerを使うために次のようにpom.xmlを書きます。
jersey-mvcは既にGlassfishに含まれているためprovidedにします。
jersey-mvcはservlet-api2.4に依存しているんですが関係あるのはjspを使うときのようなので
https://jersey.java.net/documentation/latest/mvc.html#d0e13760
もともと含まれてる3系を使うように依存関係から外してます(ホントはダメかもしれないです)
jerseyの各ライブラリのバージョンはGlassfish4.0.1build4にあわせて2.5.1にしています。
<dependency> <groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-mvc</artifactId> <version>2.5.1</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-mvc-freemarker</artifactId> <version>2.5.1</version> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency>
ここまで起動はうまくいきます。
CDIエラー
続いて、jsonを使用するためのライブラリとしてjacksonを追加します。
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.5.1</version> </dependency>
すると、起動時にこのようなエラーが出るようになります。
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Set] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set )] at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225) at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131) at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
この事象は
guavaのバージョンを15にあげれば解決するようです。
詳細はこちら
ただ、guava15をpomに追加してもこんなエラーが出てしまいます。
重大: Exception during lifecycle processing org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [IterableProvider>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 2 of [BackedAnnotatedConstructor] @Inject org.glassfish.jersey.internal.inject.JerseyClassAnalyzer(@Named ClassAnalyzer, IterableProvider >)] at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225) at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
ここ、結構はまったんですが、結局はjersey-commonもprovidedにすればいいだけでした。
なぜはまったかというと、jersey-mvcをprovidedにした時点でそこからさらに依存しているライブラリもprovidedになってると思い込んでました。
これは基本的にはそのとおりなんですが、他にも依存関係が定義されているライブラリをpomに追加した場合、providedなライブラリを経由しないとscopeがcompileとなってしまうようです。
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> <version>2.5.1</version> <scope>provided</scope> </dependency>
同様にjersey-bean-validationを追加したとき、jersey-serverがcompileとなり下記のようなエラーとなるので、providedで設定する必要があります。
重大: Exception during lifecycle processing org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [ContainerRequest] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject org.glassfish.jersey.server.internal.routing.UriRoutingContext(ContainerRequest, ProcessingProviders)] at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225) at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
guavaのエラーについて
ここ(再掲)にも書いてあるんですが、「バージョン14をWEB-INF/libに含めてデプロイすると」なので、そもそもprovidedであれば問題ないような気がします。
上のようにjersey-commonやjersey-serverをprovidedとすればとりあえずはguavaもprovidedとなって正常に起動しますし、明示的にguavaをprovidedとしてもいいと思います。
まとめ
結局、jersey使うときはjersey-commonやjersey-serverのようなGlassfishにバンドルされているライブラリはprovidedで設定しておいたほうがいいということだと思います。