无法加载容器提供程序类:org.glassfish.tyrus.container.grizzly.GrizzlyEngine

Posted

技术标签:

【中文标题】无法加载容器提供程序类:org.glassfish.tyrus.container.grizzly.GrizzlyEngine【英文标题】:Failed to load container provider class: org.glassfish.tyrus.container.grizzly.GrizzlyEngine 【发布时间】:2015-12-07 18:46:12 【问题描述】:

我是 WebSockets 的新手。为了开始学习,我关注了this 教程。并简单地复制 ClientEndpointServerEndpoint 并使用 tyrus 部署服务器。

但是当我尝试运行服务器时,它会抛出这个错误:

Failed to load container provider class: org.glassfish.tyrus.container.grizzly.GrizzlyEngine

这里是部署代码(我已经注释了我出错的那一行):

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.glassfish.tyrus.server.Server;

public class WebSocketServer 

    public static void main(String[] args) 
        runServer();
    

    public static void runServer() 

        Server server = new Server("localhost", 8000, "/websockets", WordgameServerEndpoint.class);

        try 
            server.start(); //i get the error on this line
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Please press a key to stop the server.");
            reader.readLine();
         catch (Exception e) 
            System.out.println(e.getMessage());
         finally 
            server.stop();
        
    

这是服务器代码:

import java.io.IOException;
import java.util.logging.Logger;

import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.CloseReason.CloseCodes;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/game")
public class WordgameServerEndpoint 

    private Logger logger = Logger.getLogger(this.getClass().getName());

    @OnOpen
    public void onOpen(Session session) 
        logger.info("Connected ... " + session.getId());
    

    @OnMessage
    public String onMessage(String message, Session session) 
        switch (message) 
            case "quit":
                try 
                    session.close(new CloseReason(CloseCodes.NORMAL_CLOSURE, "Game ended"));
                 catch (IOException e) 
                    throw new RuntimeException(e);
                
                break;
        
        return message;
    

    @OnClose
    public void onClose(Session session, CloseReason closeReason) 
        logger.info(String.format("Session %s closed because of %s", session.getId(), closeReason));
    

我会很感激任何帮助:)

【问题讨论】:

你能解决它吗?? 不,不是。我改变了使用 OkHTTP 库的方式,这更容易处理。 哦好吧..我们的捆绑是不同的,因为我们使用 Apache karaf 进行捆绑,问题似乎是类加载器没有加载这个 GrizzlyEngine(它的 OSGI 框架问题)。如果作为独立应用程序运行,这个 jar 恰好运行良好。您是将该应用作为独立应用运行还是在 Web 容器内运行? 不,我只是作为独立应用尝试过。 【参考方案1】:

这似乎是一个依赖问题,

如果你是 maven 用户:

<dependencies>
    <dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.tyrus</groupId>
        <artifactId>tyrus-server</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.tyrus</groupId>
        <artifactId>tyrus-client</artifactId>
        <version>1.1</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.tyrus</groupId>
        <artifactId>tyrus-container-grizzly</artifactId>
        <version>1.1</version>
    </dependency>

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.5</version>
    </dependency>
</dependencies>

或加载以下罐子:

grizzly-framework-2.3.3.jar grizzly-http-2.3.3.jar grizzly-http-server-2.3.3.jar grizzly-rcm-2.3.3.jar javax.websocket-api-1.0.jar tyrus-client-1.1.jar tyrus-container-grizzly-1.1.jar tyrus-core-1.1.jar tyrus-server-1.1.jar tyrus-spi-1.1.jar tyrus-websocket-core-1.1.jar

请记住客户端和服务器实现的这些依赖关系。

【讨论】:

以上是关于无法加载容器提供程序类:org.glassfish.tyrus.container.grizzly.GrizzlyEngine的主要内容,如果未能解决你的问题,请参考以下文章

实例化 servlet 类 org.glassfish.jersey.servlet.ServletContainer 时出错

java.lang.NoSuchMethodError:org.glassfish.jersey.server.ApplicationHandler。

错误 404:javax.servlet.UnavailableException:SRVE0201E:Servlet [org.glassfish.jersey.servlet.ServletCon

无法模拟 Glassfish Jersey 客户端响应对象

无法在 docker 容器内以非阻塞方式读取类路径资源文件

无法加载或初始化请求的服务提供程序