java - ClassNotFoundException:ClientBuilder Jersey 2.25.1 Tomcat 9.0

标签 java rest tomcat jersey classnotfoundexception

这几天我一直在为这个问题苦苦挣扎,但找不到合适的解决方案。我已阅读类似的问题,但所提供的解决方案均不足。

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

真正让我绞尽脑汁的是,我可以在 public static 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 :这个真的不相关,因为他们有一个不同的异常(exception)。
解决方案 4:对 pom.xml 的更改没有影响。
解决方案 5:我尝试创建一个 META-INF 目录并添加被告知的内容,但仍然没有。
解决方案 6:尝试添加指定的依赖项_无效,所以我立即将其删除。

我的项目目录:enter image description here

最佳答案

您必须创建打包类型 war,将您的 jars 包含在依赖项中,在终端中运行 mvn build,导航到目标文件夹,您将在其中包含所有内容的 war 文件。

关于java - ClassNotFoundException:ClientBuilder Jersey 2.25.1 Tomcat 9.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45244893/

相关文章:

java - 如何在JAVA中转义Restful API查询字符串中的特殊字符

c# - 如何使用 Advanced Rest Client 发出 POST 请求

c# - 使用 PayPal HERE 和 PayPal API

java - IBM JMS MQ 在 MQM header 中添加用户 ID

java - 是否可以通过对 apk 进行逆向工程来破解应用程序?

java - H2 数据库 : how to protect with encryption, 不暴露文件加密 key

java - 如何通过catalina.out查找tomcat自动关机原因

linux - 即使在 CAS 服务器中成功验证后也无法重定向到应用程序页面

java - 验证临时对象是否已创建

java - 读取 JScrollPane 的内容