簡體   English   中英

Tomcat 7.0 服務無法啟動 ClassNotFoundException: javax.ws.rs.ProcessingException

[英]Tomcat 7.0 service fails to start with ClassNotFoundException: javax.ws.rs.ProcessingException

我有一個玩具 REST Web 服務,我正嘗試將其部署到 Tomcat 7.0 服務器。 問題是我什至無法啟動服務器。 這是我收到的錯誤消息:

嚴重:啟動期間子容器失敗 java.util.concurrent.ExecutionException:org.apache.catalina.LifecycleException:無法在 java.util 啟動組件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorldRestService]]。 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) 在 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) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:640) 在 java.la ng.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: 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) 在 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) 在 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 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) at org.apache。 catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) ... 20 更多

嚴重:啟動期間子容器失敗 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 無法在 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) 在 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) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 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) 引起:org.apache.catalina.LifecycleException:無法啟動組件[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) ) 在 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) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:640) 在 java.lang.Thread.run(Thread.java:853) 引起:o rg.apache.catalina.LifecycleException:子容器在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java: 800) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 6 更多

嚴重:所需的服務器組件無法啟動,因此 Tomcat 無法啟動。 org.apache.catalina.LifecycleException:無法在 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) .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:無法在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 的 org.apache.catalina 啟動組件 [StandardService[Catalina]]。 core.StandardServer.startInternal(StandardServer.java:732) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 7 more 引起:org .apache.catalina.LifecycleException:無法在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 的 org.apache.catalina.core.StandardService.startInternal(StandardService) 處啟動組件 [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) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java) :150) ... 11 個

我正在使用 Jersey 2.x。 這是我的罐子:

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

球衣客戶端.jar

jersey-common.jar

球衣容器servlet.jar

jersey-container-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;
}
}

你好世界.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 類,我該如何擺脫這個錯誤?

非常感謝!

看起來 javax.ws.rs.ProcessingException 是 javax.ws.rs 包的一部分,它是 rest 的一部分,但默認情況下不隨 Java 或 Tomcat 一起提供。

它似乎包含在 javax.ws.rs-api-2.0.jar 中。 Maven 存儲庫上還有一個 javax.ws.rs 版本。

看起來 Jersey REFERENCES 但沒有實現這個類。

https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/class-use/ProcessingException.html

因此,您將需要下載相應的 jar 並將其包含在您的類路徑中,以便它能夠使用 ProcessingException 並啟動您的容器。

看了一些。 希望Jersey.java.net 能提供這個庫作為他們包的一部分。 如果他們不這樣做,您將不得不自己從 Maven 中提取 REST 先決條件。

抱歉,文本不是專門針對您的問題量身定制的(但它應該可以完成工作)。 我回答了一個類似的問題,所以我只是重復使用它。

如果您使用標准的 Tomcat 安裝(或其他一些 servlet 容器),AFAIK 您不能避免明確告訴它在web.xml文件中啟動哪些 servlet*。 由於無論如何您都必須使用web.xml ,因此讓寧靜的 Web 服務工作的最簡單方法是忘記完全擴展javax.ws.rs.core.Application並在那里指定上下文路徑。 您仍然可以使用標准的 jax-rs 注釋來聲明實際的 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的人請發布他們會是什么。

如果您使用 Maven,只需在pom.xml文件的dependencies部分中向jersey-servlet添加依賴項:

<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 中的上下文的方法,請糾正我——也許通過使用上下文或生命周期偵聽器?

OP 使用的是javax.ws.rs-api 2.0-m10 版本 預發布版本正在開發中,可能與最終版本有所不同。

在這種情況下, javax.ws.rs.ProcessingException類不存在。 使用工件的最終版本 2.0 (在發布此問題一年發布)應該可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM