Jersey REST服务的WAR部署失败,但是Guava在那里

时间:2016-09-25 14:22:11

标签: jersey tomcat7 guava

我无法在Tomcat7安装上部署Jersey REST服务的WAR。

Tomcat在一个Docker容器内运行,到目前为止这个容器完美无缺。

我在/var/lib/tomcat7/webapps中复制WAR,并且初始化失败,抱怨缺少Guava类:

2016-09-25T13:29:55.444368315Z org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/simple02]]
. . . . .
2016-09-25T13:29:55.444460727Z Caused by: java.lang.NoClassDefFoundError: com/google/common/base/Function
....
2016-09-25T13:29:55.444483641Z  at org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer.onStartup(JerseyServletContainerInitializer.java:132)

问题是: jersey-container-servlet.jar (包含JerseyServletContainerInitializer)和 jersey-guava-2.8.jar (包含Function)都在同一个WAR内的lib目录。

我的假设是Tomcat实际上完全忽略了我的lib目录并且从自己的一些Jersey JAR运行JerseyServletContainerInitializer

我不想在一个通用的Tomcat容器的定义中粘贴一个Guava JAR,而是希望从我的web.xml开始操作。

这可能吗?我尝试了几次没有成功。

WAR的结构如下:

/WEB-INF
    /classes
        /com, etc. etc.
    /lib
        /javax.ws.rs-api-2.0.jar
        /jersey-client.jar
        /jersey-common.jar
        /jersey-container-servlet.jar
        /jersey-container-servlet-core.jar
        /jersey-guava-2.8.jar
        /jersey-server.jar
    /web.xml
/META-INF
    /MANIFEST.MF

1 个答案:

答案 0 :(得分:1)

Jersey-guava-2.8是guava重新打包为泽西内部依赖,但仅在球衣2.6.x版本之后添加为内部依赖。您拥有的版本jersey-container-servlet.jar是在2.6.x之前,当时jersey依赖于Guava。因此,修复方法是使用最新的jersey-container-servlet.jar以及所有其他依赖项或至少使用2.6.x之后的版本。