在 Tomcat 上实现 Jersey 时出现“javax.servlet.ServletException: java.lang.NoClassDefFoundError”

Posted

技术标签:

【中文标题】在 Tomcat 上实现 Jersey 时出现“javax.servlet.ServletException: java.lang.NoClassDefFoundError”【英文标题】:"javax.servlet.ServletException: java.lang.NoClassDefFoundError" when implementing Jersey on Tomcat 【发布时间】:2014-04-17 10:54:54 【问题描述】:

当我尝试在 Linux 服务器上使用(“sudo service tomcat7 start”)在 Tomcat 上实现以下方法时,除了这个之外,所有其他方法都可以正常工作。

@GET
    @Path("getapk")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response getApk() 
        System.out.println("GetApk!");
        final File apkFile = new File(apkFileLocation).listFiles()[0];
        return Response.ok(
                    new StreamingOutput() 
                        public void write(OutputStream output) throws IOException,
                        WebApplicationException 
                            output.write(Files.readAllBytes(apkFile.toPath()));
                        
                    
                ).header("Content-Disposition", ContentDisposition.type("attachment").fileName(apkFile.getName()).build())
                .build();
    

奇怪的是,当我在 Eclipse 中“在服务器上运行”时,这种方法运行良好。

以下是我收到的错误消息:

HTTP 状态 500 -

输入异常报告

消息

描述服务器遇到一个内部错误()阻止 它无法满足此请求。

异常

javax.servlet.ServletException: java.lang.NoClassDefFoundError: robertlee/resource/EcgCloudDatabase$1 com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 根 原因

java.lang.NoClassDefFoundError: robertlee/resource/EcgCloudDatabase$1 robertlee.resource.EcgCloudDatabase.getApk(EcgCloudDatabase.java:691) sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:606) com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) com.sun.jersey.server.impl.model.method.dispatch.Abs​​tractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 根 原因

java.lang.ClassNotFoundException: robertlee.resource.EcgCloudDatabase$1 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546) robertlee.resource.EcgCloudDatabase.getApk(EcgCloudDatabase.java:691) sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:606) com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) com.sun.jersey.server.impl.model.method.dispatch.Abs​​tractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 注意 Apache 中提供了根本原因的完整堆栈跟踪 Tomcat/7.0.26 日志。

Apache Tomcat/7.0.26

请帮忙,非常感谢....

【问题讨论】:

【参考方案1】:

您需要在 WEB-INF/lib 中包含包含 robertlee/resource/EcgCloudDatabase 类的 jar 并重新创建您的部署。

【讨论】:

谢谢,不过我已经在tomcat7/webapps/EcgCloudDatabase/WEB-INF/lib中包含了所有需要的jar,这些jar和我在eclipse中使用的完全一样 那么您可能想要跟进note The full stack trace of the root cause is available in the Apache Tomcat/7.0.26 logs. 位。可能有一个潜在的原因触发了这个。

以上是关于在 Tomcat 上实现 Jersey 时出现“javax.servlet.ServletException: java.lang.NoClassDefFoundError”的主要内容,如果未能解决你的问题,请参考以下文章

从 Jersey REST 客户端调用时出现 405 错误代码

使用 jersey 客户端通过 HTTPS 调用 api 时出现错误 handshake_failure。我已关闭服务器证书有效性检查

myeclipse10集成Tomcat6时出现错误

尝试启动 Tomcat 时出现休眠异常

使用 AutoIT 连接到远程 SQL Server 时出现问题

在Eclipse中启动tomcat后访问tomcat首页时出现404