我有一个玩具REST Web服务,我正在尝试部署到Tomcat 7.0服务器 . 问题是我甚至无法启动服务器 . 这是我得到的错误消息:
SEVERE:启动时子容器失败java.util.concurrent.ExecutionException:org.apache.catalina.LifecycleException:无法在java.util启动组件[StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/ HelloWorldRestService]] .concurrent.FutureTask.report(FutureTask.java:133),位于org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)的java.util.concurrent.FutureTask.get(FutureTask.java:199) Org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)位于org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)org.apache.catalina.core.ContainerBase $ StartChild . 在java.util的java.util.concurrent.FutureTask.run(FutureTask.java:273)的org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1549)调用(ContainerBase.java:1559) java的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:640)中的.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1170) . lang.Thread.run(Thread.java:853)引起:org.apache.catalina.LifecycleException:无法在org.apache.catalina启动组件[StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/ HelloWorldRestService]] .util.LifecycleBase.start(LifecycleBase.java:154)... 6更多引起:java.lang.NoClassDefFoundError:java.lang上的java.lang.J9VMInternals.prepareClassImpl(Native Method)中的javax.ws.rs.ProcessingException位于org.apache的org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106)的java.lang.Class.getDeclaredFields(Class.java:685)中的.J9VMInternals.prepare(J9VMInternals.java:1122) . 位于org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:142)的catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:263)org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java: 67)at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(Conte) xtConfig.java:405)org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:881)org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:376)org.apache.catalina .util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5322) )org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)... 6更多引起:java.lang.ClassNotFoundException:org.apache.catalina.loader中的javax.ws.rs.ProcessingException . webappClassLoader.loadClass(WebappClassLoader.java:1702)位于org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)... 20更多严重:启动时子容器失败java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException:无法启动组件[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)org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302)org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)at org.apache.catalina.core.StandardService org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)中的.startInternal(StandardService.java:443)位于org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)的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 . 在java.lang.reflect.Method.invoke(我)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)中的reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:94) thod.java:619)org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)引起:org.apache .catalina.LifecycleException:无法启动组件[StandardEngine [Catalina] .StandardHost [localhost]]在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1559 )at java.util.concurrent.ThreadPoolExecutor.runWorker的java.util.concurrent.FutureTask.run(FutureTask.java:273)org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1549) ThreadPoolExecutor.java:1170)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:640)at java.lang.Thread.run(Thread.java:853)引起:org.apache.catalina.LifecycleException :org.apache启动时org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)org.apache中的org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)启动时,子容器失败 . catalina.util.LifecycleBase.start(LifecycleBase.java:150)... 6更多严重:所需的服务器组件无法启动,因此Tomcat无法启动 . org.apache.catalina.LifecycleException:无法在org.apache.catalina.startup.Catalina.start的org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)启动组件[StandardServer [8005]]( Catalina.java:691)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:94)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)at java org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)中的.lang.reflect.Method.invoke(Method.java:619)org.apache.catalina.startup.Bootstrap.main(Bootstrap.java) :456)引起:org.apache.catalina.LifecycleException:无法在org.apache.catalina的org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)启动组件[StandardService [Catalina]] . core.tandardServer.startInternal(StandardServer.java:732)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)... 7更多引起:org .apache.catalina.LifecycleException:无法在org.apache.catalina.core.StandardService.startInternal(StandardService)的org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)启动组件[StandardEngine [Catalina]] .java:443)org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)... 9更多引起:org.apache.catalina.LifecycleException:org.apache启动时子容器失败.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java) :150)......还有11个
我正在使用Jersey 2.x.这是我的 jar :
javax.ws.rs-API-2.0-m10.jar
球衣-client.jar中
球衣-common.jar
新泽西州容器的servlet.jar
新泽西州容器的servlet-core.jar添加
新泽西州的server.jar
我的web.xml看起来像这样:
<?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!!";
}
}
怎么了?为什么我看到这个缺少的ProcessingException类,如何摆脱这个错误?
非常感谢!
2 回答
似乎javax.ws.rs.ProcessingException是javax.ws.rs包的一部分,它是休息的一部分,但默认情况下不随Java或Tomcat提供 .
它似乎包含在javax.ws.rs-api-2.0.jar等中 . Maven存储库上还有一个版本的javax.ws.rs .
看来泽西参考,但没有实施这一课程 .
https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/class-use/ProcessingException.html
因此,您需要下载相应的jar并将其包含在类路径中,以便它能够使用ProcessingException并启动容器 .
有些看了 . 我希望Jersey.java.net能够将这个库作为其捆绑包的一部分提供 . 如果他们不必自己从Maven中取出REST先决条件 .
对不起,该文本不是专门为您的问题量身定做的(但它应该完成工作) . 我回答了类似的问题,所以我只是重复使用它 .
如果你're using a standard Tomcat install (or some other servlet container), AFAIK you can' t避免明确地告诉它在
web.xml
文件中启动哪些servlet * . 因为无论如何你必须使用web.xml
,让restful web服务工作的最简单方法就是忘记完全扩展javax.ws.rs.core.Application
并在那里指定上下文路径 . 您仍然可以使用标准的jax-rs注释来声明实际的Web服务 .web.xml中:
两个值得注意的要点:
由于servlet容器,您需要在WAR文件中捆绑REST实现不要't usually contain one. Since Jersey is the reference implementation for JAX-RS, that'是我在上面的
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
--maybe将Tom servlet添加到Tomcat中的上下文,请有人纠正我?