rest - 在 tomcat8、eclipse 中创建 RESTful API 时在 Jersey JAR 上出现错误
问题描述
在 tomcat8、eclipse 中创建 RESTful API 时在 Jersey JAR 上出现错误。我正在使用 jdk1.8.0_171 和 Apache-Tomcat-8.0.24。
- 我在 Eclipse 中创建了一个动态 Web 项目。
- 将所有 JAR 放入 MyProject->WebContent->WEB-INF->lib 中,该文件已从https://jersey.github.io/download.html下载。
- 在 web.xml 文件中定义 servlet-name、servlet-class、init-param、servlet-mapping 等。
- 在 src 文件夹下创建一个包(wsdemo2)并创建一个 java 类(wsdemo2.java),其中还包含一个公共类和一个公共方法。
- 我使用了 @Path("/name"),@GET,@Produces(MediaType.TEXT_HTML),@Path("{name}") 之类的注释
- 编译成功,但每当我尝试启动服务器时,它会在少数 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;
}
}
解决方案
推荐阅读
- python - 这个背包问题的实现有什么问题?
- c# - 有没有办法检查类型
从接口继承然后使用 t.InterfaceMethod() - javascript - body中选择对象的条件:JSON.stringify()
- c++ - 来自公共接口的兄弟姐妹的交叉引用
- python - 通过拆分另一个列表的索引在 Python 中创建一个列表可能吗?
- python - wagtail-generic-chooser 小部件 (NoReverseMatch)
- javascript - 如何使用javascript交换html div元素位置
- python - ValueError:无法将输入数组从形状(11,140,55)广播到形状(11,140,11)
- android - 每次询问时如何确保获得gps位置
- swift - Google Firebase:如何使用 Snapchat 对用户进行身份验证?