Glassfish4.0.1+jerseyでCDIエラー

最初に

まず、jersey-mvc-freemarkerを使うために次のようにpom.xmlを書きます。
jersey-mvcは既にGlassfishに含まれているためprovidedにします。
jersey-mvcservlet-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で設定しておいたほうがいいということだと思います。