【问题标题】:ClassNotFoundException: ClientBuilder Jersey 2.25.1 Tomcat 9.0ClassNotFoundException:ClientBuilder Jersey 2.25.1 Tomcat 9.0
【发布时间】:2017-07-21 18:55:33
【问题描述】:

我已经为此苦苦挣扎了几天,无法找到合适的解决方案。我已经阅读了类似的问题,但提供的解决方案都不足够。

我的规格:Tomcat 9.0.0.M22、Jersey 2.25.1、Maven 4.0.0、IntelliJ 2017.1.4。

让我绞尽脑汁的事实是,我可以在公共静态 void main(){} 函数中毫无障碍地运行代码。我认为这意味着我的 jar 被 Maven 正确包含。但是,当我尝试通过 ServletContextListener 在 Tomcat 9.0 上运行它时,它会在 ClientBuilder.newBuilder().register(SseFeature.class).build() 调用上冻结并抛出此错误。

Tomcat LocalHost 日志:

21-Jul-2017 13:33:05.611 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [Web.Servlets.EventListener]
 java.lang.NoClassDefFoundError: org/glassfish/jersey/client/ClientBuilder
    at Web.Servlets.EventListener.contextInitialized(EventListener.java:19)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4633)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5095)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:740)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:716)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1729)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:456)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:405)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientBuilder
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1269)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104)
    ... 46 more

我的 pom.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>groupId</groupId>
    <artifactId>EventStreams</artifactId>
    <version>1.0-SNAPSHOT</version>
   <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-sse</artifactId>
            <version>2.25.1</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.25.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>22.0</version>
        </dependency>
    </dependencies>
</project>

我的监听器代码:

import org.glassfish.jersey.media.sse.SseFeature;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;

public class EventListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("I got in here");
        Client client1 = ClientBuilder.newBuilder().register(SseFeature.class).build();
        System.out.println("I never make it here");
    }
    public void contextDestroyed(ServletContextEvent sce) {}
}

解决方案1:我尝试将 *jersey-client-2.25.1.jar、*jersey-media-sse-2.25.1.jar 和 *guava-22.0.jar 放在我的 WEB-INF/libs 目录中。
解决方案2:我使用的是 Jersey 2.25.1。
解决方案3:这个真的不相关,因为他们有一个不同的例外。
解决方案4:对 pom.xml 的更改没有影响。
解决方案5:我尝试创建一个 META-INF 目录并添加所告知的内容,但仍然没有。
解决方案6:尝试添加指定的依赖项_不起作用,所以我及时将其删除。

我的项目目录:

【问题讨论】:

  • 您的应用程序的封装类型是什么?我假设您正在创建一个战争文件,但这在您的 pom.xml 中并不明显。那么,你是如何包装它的呢?
  • 我正在通过项目结构 -> 工件窗口创建一个分解的战争文件。你是说这个应该在pom.xml中指定,而不是我启动项目后手动设置?

标签: java rest tomcat jersey classnotfoundexception


【解决方案1】:

您必须进行打包类型战争,在依赖项中包含您的 jar,在终端中运行 mvn build,导航到目标文件夹,您将在其中包含一个战争文件。

【讨论】:

    【解决方案2】:

    已解决

    我没有在我的 WEB-INF/libs 目录中添加足够多的库。我必须进入项目结构->工件->在“可用元素”下->右键单击将元素添加到 WEB-INF/libs。我手动添加了 3 个 .jar 文件,但显然我遗漏了一些东西。在我将整个外部库添加到 libs 目录后,修复了它。我列出的 6 个解决方案在我删除它们后都没有破坏我的应用程序。我是在阅读Tomcat Best Practices 之后得出这个结论的。我觉得这应该由 Maven 以某种方式自动完成,如果有人可以提出最佳实践,请随意这样做。

    PS:我应该删除这个问题吗?

    【讨论】:

    • 为什么在手动添加时使用 maven?您应该将它们添加到 inti maven 依赖项中,它应该为您构建战争。您没有正确使用 maven。
    • Well maven 会将它们放入我的“外部库”中。这就是我能够在 java 类中运行代码的原因。在我将依赖项添加到我的 pom.xml 之后,它通过自动导入自动为我完成了这项工作,但由于某种原因,我没有正确设置项目以将它们也添加到我的战争中。那就是我必须手动完成的地方(“可用元素”-> Ctrl-A-> 右键单击​​-> 添加到 WEB-INF/libs)。这并没有太大的麻烦,但是是的,我确实觉得我可以更有效地使用 maven。
    猜你喜欢
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多