首页 > 解决方案 > 在 tomcat8、eclipse 中创建 RESTful API 时在 Jersey JAR 上出现错误

问题描述

在 tomcat8、eclipse 中创建 RESTful API 时在 Jersey JAR 上出现错误。我正在使用 jdk1.8.0_171 和 Apache-Tomcat-8.0.24。

  1. 我在 Eclipse 中创建了一个动态 Web 项目。
  2. 将所有 JAR 放入 MyProject->WebContent->WEB-INF->lib 中,该文件已从https://jersey.github.io/download.html下载。
  3. 在 web.xml 文件中定义 servlet-name、servlet-class、init-param、servlet-mapping 等。
  4. 在 src 文件夹下创建一个包(wsdemo2)并创建一个 java 类(wsdemo2.java),其中还包含一个公共类和一个公共方法。
  5. 我使用了 @Path("/name"),@GET,@Produces(MediaType.TEXT_HTML),@Path("{name}") 之类的注释
  6. 编译成功,但每当我尝试启动服务器时,它会在少数 Jersey JAR 上发生一些 ClassFormatException,例如 - jakarta.json-api-1.1.5.jar, yasson-1.0.3.jar, jakarta.ws.rs-api-2.1.5.jar, jakarta.json.bind-api-1.0.1.jar, jakarta.xml.bind-api-2.3.2.jar

示例 1 错误:

Apr 20, 2019 12:33:21 PM org.apache.catalina.startup.ContextConfig processAnnotationsJar
SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:file:/E:/DemoUser/Demo%20Tomcat%20Workspace/apache-tomcat-8.0.24/webapps/MyProject/WEB-INF/lib/jakarta.json-api-1.1.5.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19
    at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:97)
    at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:55)
    at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:176)
    at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:85)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2011)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1961)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1936)
    at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1897)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1149)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:771)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:305)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5066)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

web.xml

<servlet>
      <servlet-name>JAVA WS</servlet-name>
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>wsdemo2</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>JAVA WS</servlet-name>
  <url-pattern>/*</url-pattern>
  </servlet-mapping>

wsdemo2.java

package wsdemo2;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/wsdemo2")
public class wsdemo2 {
    @GET
    @Produces(MediaType.TEXT_HTML)
    @Path("{name}")
    public String sayhello2(@PathParam("name") String name) {
        String response = "<h1>Your name is > "+name+"</h1>";
        return response;
    }
}

标签: restweb-servicesjerseytomcat8

解决方案


推荐阅读