I have a toy REST web service that I'm trying to deploy to Tomcat 7.0 server. The problem is I can't even start the server. Here's the error message I'm getting:
SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorldRestService]] at java.util.concurrent.FutureTask.report(FutureTask.java:133) at java.util.concurrent.FutureTask.get(FutureTask.java:199) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask.run(FutureTask.java:273) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1170) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:640) at java.lang.Thread.run(Thread.java:853) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorldRestService]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) ... 6 more
Caused by: java.lang.NoClassDefFoundError: javax.ws.rs.ProcessingException at java.lang.J9VMInternals.prepareClassImpl(Native Method) at java.lang.J9VMInternals.prepare(J9VMInternals.java:1122) at java.lang.Class.getDeclaredFields(Class.java:685) at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106) at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:263) at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:142) at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:67) at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:405) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:881) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:376) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5322) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 6 more Caused by: java.lang.ClassNotFoundException: javax.ws.rs.ProcessingException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) ... 20 more
SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] at java.util.concurrent.FutureTask.report(FutureTask.java:133) at java.util.concurrent.FutureTask.get(FutureTask.java:199) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.startup.Catalina.start(Catalina.java:691) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:94) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) at java.lang.reflect.Method.invoke(Method.java:619) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask.run(FutureTask.java:273) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1170) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:640) at java.lang.Thread.run(Thread.java:853) Caused by: org.apache.catalina.LifecycleException: A child container failed during start at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 6 more
SEVERE: The required Server component failed to start so Tomcat is unable to start. org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.startup.Catalina.start(Catalina.java:691) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:94) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) at java.lang.reflect.Method.invoke(Method.java:619) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 7 more Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 9 more Caused by: org.apache.catalina.LifecycleException: A child container failed during start at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 11 more
I'm using Jersey 2.x. Here're my jars:
javax.ws.rs-api-2.0-m10.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet.jar
jersey-container-servlet-core.jar
jersey-server.jar
My web.xml looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" 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_3_0.xsd">
<display-name>HelloWorldRestService</display-name>
<servlet>
<servlet-name>java.helloworldrestservice.resources.HelloWorldApplication</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register JAX-RS Application, if needed. -->
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>java.helloworldrestservice.resources.HelloWorldApplication</param-value>
</init-param>
<!-- Register resources and providers under my.package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>java.helloworldrestservice.resources</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>java.helloworldrestservice.resources.HelloWorldApplication</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
HelloWorldApplication.java:
package java.helloworldrestservice.resources;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class HelloWorldApplication extends Application
{
@Override
public Set<Class<?>> getClasses()
{
//log.info("starting the HelloWorld application...");
Set<Class<?>> set = new HashSet<Class<?>>();
set.add(HelloWorld.class);
return set;
}
}
HelloWorld.java:
package java.helloworldrestservice.resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class HelloWorld {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello()
{
return "Hello World!!";
}
}
What is wrong? Why do I see this missing ProcessingException class and how can I get rid of this error?
Thanks a lot!
3条答案
按热度按时间6fe3ivhb1#
wwwjavax.ws.rs.ProcessingException似乎是javax.ws.rs包的一部分,该包是rest包的一部分,但默认情况下不随Java或Tomcat一起提供。
它似乎包含在javax.ws.rs中。Maven存储库中也提供了javax.ws.rs的一个版本。
Jersey似乎引用但未实现此类。
https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/class-use/ProcessingException.html
因此,您需要下载相应的jar并将其包含在类路径中,以便它能够使用ProcessingException并启动容器。
我做了一些调查。我 * 希望 * Jersey.java.net会提供这个库作为他们捆绑包的一部分。如果他们没有,你将不得不自己从Maven中取出REST先决条件。
ffdz8vbo2#
抱歉,这段文字并不是针对你的问题量身定做的(但它应该能完成任务)。我回答了一个类似的问题,所以我只是重复使用它。
如果使用标准Tomcat安装(或其他servlet容器),AFAIK,您无法避免显式地告诉它在
web.xml
文件中启动哪些servlet *。让REST Web服务正常工作的最简单的方法是忘记完全扩展javax.ws.rs.core.Application
,而只是在那里指定上下文路径。rs注解来声明实际的Web服务。web.xml:
两点值得注意:
1.您需要在WAR文件中捆绑REST实现,因为servlet容器通常不包含REST实现。因为Jersey是JAX-RS的参考实现,所以我在上面的
servlet-class
元素中使用了它。如果需要,您可以用Apache CXF实现替换它。init-param
元素告诉Jersey在哪个包中搜索带有Web服务注解的Java文件。编辑此元素以指向您的Web服务。注意,如果您选择使用apache CXF而不是Jersey,则任何init-param
元素中所需的内容都将不同。了解CXF的人请发布这些内容。如果您使用的是Maven,只需在
pom.xml
文件的dependencies
部分中为jersey-servlet
添加一个依赖项即可:在此之后,使用Java类中的标准JAX-RS注解直接声明Web服务:
如果Tomcat安装在本地端口8080上运行,并且您将WAR文件部署到上下文
myContext
,请转到......应产生预期结果(5)。
干杯!干杯!
web.xml
而将Jersey servlet添加到Tomcat中的上下文的方法--也许通过使用上下文或生命周期侦听器--请纠正我。dwthyt8l3#
OP使用
javax.ws.rs-api
的version 2.0-m10。预发布版本正在开发中,可能与最终版本存在差异。在这个例子中,
javax.ws.rs.ProcessingException
类是不存在的。使用工件的最后一个version 2.0(在这个问题发布的前一年发布的)应该可以解决这个问题。