org.glassfish.jersey.servlet.ServletContainer ClassNotFoundException
Posted
技术标签:
【中文标题】org.glassfish.jersey.servlet.ServletContainer ClassNotFoundException【英文标题】: 【发布时间】:2014-03-28 03:26:29 【问题描述】:我收到 org.glassfish.jersey.servlet.ServletContainer
的 ClassNotFoundException 异常,但昨晚我尝试使用 Eclipse Juno 启动/重新启动我的 Tomcat 服务器 (v7) 时,它特别开始。
不知道发生了什么。奇怪的是,它昨晚才开始发生,而在此之前它运行良好。
这是堆栈跟踪:
Feb 25, 2014 11:11:19 AM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet com.att.ucomm.admin.UCommAdminFunctions as unavailable
Feb 25, 2014 11:11:19 AM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /UCommAdminFunctions threw load() exception
java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1671)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118 )
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4762)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5045)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:140)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3670)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:424)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1207)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1393)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1403)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1403)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1382)
at java.lang.Thread.run(Unknown Source)
Feb 25, 2014 11:11:19 AM org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/UCommAdminFunctions] is completed
Feb 25, 2014 11:13:33 AM org.apache.catalina.core.StandardWrapperValve invoke
INFO: Servlet com.att.ucomm.admin.UCommAdminFunctions is currently unavailable
这是我的 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>com.att.ucomm.admin.UCommAdminFunctions</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register JAX-RS Application, if needed. -->
<init-param>
<param-name>com.att.ucomm.admin.UCommAdminFunctions</param-name>
<param-value>my.package.MyApplication</param-value>
</init-param>
<!-- Register resources and providers under my.package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.att.ucomm.admin</param-value>
</init-param>
<!-- Register my custom provider (not needed if it's in my.package) AND LoggingFilter. -->
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.att.ucomm.admin.SecurityRequestFilter;org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>
<!-- Enable Tracing support. -->
<init-param>
<param-name>jersey.config.server.tracing</param-name>
<param-value>ALL</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.att.ucomm.admin.UCommAdminFunctions</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
我确保球衣的 jar 文件仍在 WEB-INF/lib 中:
【问题讨论】:
如果有人在项目重命名后遇到同样的问题... 1. Project > Clean... 2. Project > Build All 【参考方案1】:问题:
java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
表示您尝试使用 Jersey 2.x servlet,但您提供的是 Jersey 1.x 库。
对于 Jersey 1.x,您必须这样做:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>sample.hello.resources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
更多信息请查看Jersey 1.x documentation。 如果您想使用 Jersey 2.x,则必须提供 Jersey 2.x 库。在基于 maven 的项目中,您可以使用以下内容:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.xx</version>
</dependency>
<!-- if you are using Jersey client specific features without the server side -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.xx</version>
</dependency>
对于 Jersey 2.x,您无需在 web.xml
中设置任何内容,提供类似于此的类就足够了:
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("rest")
public class ApplicationConfig extends Application
欲了解更多信息,请查看Jersey documentation。
另请参阅:
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer Jersey Services with Tomcat and Eclipse ClassNotFoundException when starting tomcat【讨论】:
如果你想使用 Jersey 2.x 怎么办? 无论您使用 Jersey 1 还是 2,您仍然需要依赖项(尽管旧的是 com.sun...)。您只显示 Jersey 1 的 web.xml。 根据文档,对于 Jersey 2,servlet-class 在 web.xml 中应该是<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
,但我不确定 param-name
应该是什么。 jersey.java.net/documentation/latest/deployment.html 。 更新我认为是jersey.config.server.provider.packages
。
我正在使用 Jersey 2.26,以及带有 Jdk 8 的 Tomcat 8.0。但我仍然收到错误,我已将所有 jar 包含到构建路径中。我没有使用 Maven,请给出一些不使用 Maven 的解决方案。
完美的解释。干杯。【参考方案2】:
这是 eclipse 设置问题,而不是 Jersey 问题。
来自这个线程 ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
右键单击你的 Eclipse 项目属性 -> 部署程序集 -> 添加 -> Java 构建路径条目 -> Gradle 依赖项 -> 完成。
所以当 Apache 启动时 Eclipse 没有使用 Gradle 依赖项。
【讨论】:
这应该是公认的答案。其他答案都没有真正合法地回答这个问题。 这是我一直在寻找的答案(解决了我的问题)。谢谢!Java Build Path Entries
之后没有条目,没有可选项。【参考方案3】:
如果您使用的是 Jersey 2.x,请使用以下依赖项:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.XX</version>
</dependency>
XX
可以是您要查找的任何特定版本。 Jersey Containers.
【讨论】:
【参考方案4】:我同意接受的答案。但对我来说,问题不在于,而是我不得不修改我的 Servlet-Class 名称:-
<servlet-class>org.glassfish.jersey.servlet.ServletContainer.class</servlet-class>
收件人:
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
因此,在我的情况下,删除 .class 效果很好。希望它会帮助别人!
【讨论】:
【参考方案5】:下面的代码在 web.xml 文件中对我有用
<servlet>
<servlet-name>WebService</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.example.demo.webservice</param-value>
//Package
</init-param>
<init-param>
<param-name>unit:WidgetPU</param-name>
<param-value>persistence/widget</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WebService</servlet-name>
<url-pattern>/webservices/*</url-pattern>
</servlet-mapping>
【讨论】:
【参考方案6】:jersey-container-servlet
实际上使用了jersey-container-servlet-core
依赖。但是如果你使用maven,那并不重要。如果你只定义jersey-container-servlet
的用法,它也会自动下载依赖。
但是对于那些手动将 jar 文件添加到项目中的人(即没有 maven),重要的是要知道您实际上需要两个 jar 文件。 org.glassfish.jersey.servlet.ServletContainer
类实际上是核心依赖的一部分。
【讨论】:
我不使用 Maven,我使用 Ant。在我看来,你的答案是不完整的。是的,两个 JAR 都需要,但还不够,您还需要 jersey-server.jar。否则,你会得到java.lang.ClassNotFoundException: org.glassfish.jersey.server.spi.Container
【参考方案7】:
如果你不使用 maven,试着把你的 jars 放到 WEB-INF/lib,它对我有用。
【讨论】:
【参考方案8】:假设您使用 Jersey 2.25.1,这对我有用 - 我使用的是 Apache Tomcat Web 容器:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.25.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.25.1</version>
</dependency>
注意:将版本替换为您正在使用的版本
【讨论】:
【参考方案9】:eclipse也遇到了同样的问题,WA解决方案是将库复制到WEB-INF/lib
【讨论】:
以上是关于org.glassfish.jersey.servlet.ServletContainer ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章