我无法在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
答案 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之后的版本。