将 Jersey Web 服务迁移到 Java 17 java.lang.NoClassDefFoundError:无法初始化类 org.glassfish.jersey.internal.inject.Providers

问题描述 投票:0回答:1

我目前正在将基于 Maven 的 Java 项目从 JDK 8 升级到 JDK 17。在此转换过程中,我遇到了一条阻碍我进度的特定错误消息。 目前我正在使用 Jersey 2.35。 我面临以下错误:

这是我得到的异常:::

javax.servlet.ServletException: Servlet.init() for servlet \[Servlet_Class\] threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:833)

这是根本原因::

java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.internal.inject.Providers
org.glassfish.jersey.model.internal.ComponentBag.modelFor(ComponentBag.java:495)
org.glassfish.jersey.model.internal.ComponentBag.lambda$registerModel$10(ComponentBag.java:454)
org.glassfish.jersey.internal.Errors.process(Errors.java:292)
org.glassfish.jersey.internal.Errors.process(Errors.java:274)
org.glassfish.jersey.internal.Errors.process(Errors.java:205)
org.glassfish.jersey.model.internal.ComponentBag.registerModel(ComponentBag.java:446)
org.glassfish.jersey.model.internal.ComponentBag.register(ComponentBag.java:357)
org.glassfish.jersey.model.internal.CommonConfig.register(CommonConfig.java:463)
org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:429)
    org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:306)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:339)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:833)

这里是 web.xml

<servlet>
      <servlet-name>Servlet_Class</servlet-name>
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
      <!--<init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>webservices.Jersey</param-value>
      </init-param> -->
      <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>webservices.Jersey.Servlet_Application</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
      <servlet-name>Servlet_Class</servlet-name>
      <url-pattern>/Jersey/*</url-pattern>
  </servlet-mapping>

这里是Servlet_Application.class

package webservices.Jersey;

import org.glassfish.jersey.logging.LoggingFeature;  
import org.glassfish.jersey.server.ResourceConfig;

public class Servlet_Application extends ResourceConfig {
    public Servlet_Application() 
    {
        
        packages(true, "webservices.Jersey");
        register(LoggingFeature.class);

        register(Servlet_Class.class);
        
    }
}

请帮助我找到问题并建议使用合适的 Jersey 库版本。

rest java-8 jersey java-17 jersey-client
1个回答
0
投票

问题已解决。我只是将 Jersey 库更新到版本 2.41,将 HK2 库更新到版本 2.6.1。

© www.soinside.com 2019 - 2024. All rights reserved.