Tomcat 7.0服务无法以ClassNotFoundException启动:javax.ws.rs.ProcessingException

时间:2014-05-21 13:25:28

标签: java web-services tomcat

我有一个玩具REST Web服务,我试图部署到Tomcat 7.0服务器。问题是我甚至无法启动服务器。这是我收到的错误消息:

  

严重:子容器在启动时失败   java.util.concurrent.ExecutionException:org.apache.catalina.LifecycleException:无法启动组件[StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/ HelloWorldRestService]]       at java.util.concurrent.FutureTask.report(FutureTask.java:133)       at java.util.concurrent.FutureTask.get(FutureTask.java:199)       在org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)       在org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)       在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1559)       在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1549)       在java.util.concurrent.FutureTask.run(FutureTask.java:273)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1170)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:640)       在java.lang.Thread.run(Thread.java:853)   引起:org.apache.catalina.LifecycleException:无法启动组件[StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/ HelloWorldRestService]]       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)       ......还有6个

     

引起: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)       在org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106)       at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:263)       在org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:142)       at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:67)       在org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.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:javax.ws.rs.ProcessingException       在org.apache.catalina.loader.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)       在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)       在org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)       在org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)       在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)       在java.lang.reflect.Method.invoke(Method.java:619)       在org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)       在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)       在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1549)       在java.util.concurrent.FutureTask.run(FutureTask.java:273)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1170)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:640)       在java.lang.Thread.run(Thread.java:853)   引起:org.apache.catalina.LifecycleException:子容器在启动期间失败       在org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)       在org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)       ......还有6个

     

严重:所需的服务器组件无法启动,因此Tomcat无法启动。   org.apache.catalina.LifecycleException:无法启动组件[StandardServer [8005]]       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)       在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)       在java.lang.reflect.Method.invoke(Method.java:619)       在org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)       在org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)   引起:org.apache.catalina.LifecycleException:无法启动组件[StandardService [Catalina]]       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)       在org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)       ......还有7个   引起:org.apache.catalina.LifecycleException:无法启动组件[StandardEngine [Catalina]]       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)       在org.apache.catalina.core.StandardService.startInternal(StandardService.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)       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)       ......还有11个

我使用Jersey 2.x.这是我的罐子:

javax.ws.rs-API-2.0-m10.jar

球衣-client.jar中

球衣-common.jar

Jersey的容器的servlet.jar

Jersey的容器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 个答案:

答案 0 :(得分:0)

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先决条件。

答案 1 :(得分:0)

很抱歉,该文字并非专门针对您的问题而定制(但应该完成工作)。我回答了类似的问题,所以我只是重复使用它。

如果您正在使用标准Tomcat安装(或其他一些servlet容器),AFAIK无法避免明确告诉它在web.xml文件*中启动哪些servlet。因为无论如何必须使用web.xml,让最安静的Web服务工作的最简单方法是忘记完全扩展javax.ws.rs.core.Application并在那里指定上下文路径。您仍然可以使用标准的jax-rs注释来声明实际的Web服务。

的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
  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"
  version="3.0"
>
  <servlet>
    <servlet-name>rest-test</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>com.domain.mypackage</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name> rest-test</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

两个值得注意的要点:

  1. 您需要在WAR文件中捆绑REST实现,因为servlet容器通常不包含一个。由于Jersey是JAX-RS的参考实现,因此我在上面的servlet-class元素中使用了它。如果需要,可以将其替换为Apache CXF实现。

  2. init-param元素告诉Jersey哪些软件包要搜索带有Web服务注释的Java文件。编辑此项以指向您的Web服务。请注意,如果您选择使用apache CXF而不是Jersey,则任何init-param元素中所需的内容都会有所不同。知道CXF的人请发布他们会发布的内容。

  3. 如果您使用的是Maven,只需在jersey-servlet文件的dependencies部分中为pom.xml添加依赖关系:

    <dependencies>
      <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>1.18.2</version>
      </dependency>
      ...
    </dependencies>
    

    在此之后,使用Java类中的标准JAX-RS注释直接声明Web服务:

    package com.domain.mypackage;
    import javax.ws.rs.Consumes;
    import javax.ws.rs.Produces;
    import javax.ws.rs.GET;
    import javax.ws.rs.MatrixParam;
    import javax.ws.rs.Path;
    
    // It's good practice to include a version number in the path so you can have
    // multiple versions deployed at once. That way consumers don't need to upgrade
    // right away if things are working for them.
    @Path("calc/1.0")
    public class CalculatorV1_0 {
      @GET
      @Consumes("text/plain")
      @Produces("text/plain")
      @Path("addTwoNumbers")
      public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
        return String.valueOf(n1 + n2);
      }
    }
    

    这应该是你所需要的。如果您的Tomcat安装在端口8080上本地运行,并且您将WAR文件部署到上下文myContext,请转到

    http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3
    

    ...应该产生预期的结果(5)。

    干杯!

    *如果您知道如何在不使用web.xml的情况下将Jersey servlet添加到Tomcat中的上下文中,有人可以解释一下 - 可能是通过使用上下文或生命周期监听器?