0

鉴于:

我想将打包为 WAR 的 webapp 部署web.xml到 Jetty 服务器。

在该应用程序中,我希望能够配置 JSR-356 指定的 javax websocket 端点。我更喜欢通过 提供这些端点ServerEndpointConfig而不是注释扫描。

有许多资源可以通过嵌入式 Jetty 来说明这一点,并利用了众所周知的WebSocketServerContainerInitializer.configureContext(context);API。我不能那样做,很明显。

还有其他的,直接跳转ServletContextListener并获得ServerContainervia着名的context.getAttribute("javax.websocket.server.ServerContainer")。到目前为止,我已经NULL通过这个 API 获得了很多东西,所以显然没有添加容器。

问题:

缺少的配置是什么?可以通过最好的方式完成web.xml吗?如果它是关于配置文件的,jetty.xml或者jetty.ini- 示例会很好,再次,最好是xml语法。

更新:

根据下面的答案(已接受的答案)以及我实际上试图在这里描述的 - 已知的配置方式绝对可以正常工作。说已知我的意思是通过添加到非嵌入式码头的--module=websocket一些文件,或者通过调用嵌入式码头。*.iniWebSocketServerContainerInitializer.configureContext

所以改写这个问题:有人有任何经验/知识可以通过纯粹XML的配置来启用 websocket 模块吗?

4

1 回答 1

1

如果使用 Standalone Jetty 的${jetty.base}推荐${jetty.home} 安装过程,您应该转到您的${jetty.base}实例目录并启用该websocket模块。

$ cd /path/to/mybase
$ java -jar /opt/jetty/jetty-home-9.4.14.v20181114/start.jar --add-to-start=websocket
$ grep "websocket" start.ini
--module=websocket

现在您为该${jetty.base}实例启用了 websocket。

如果您希望 Jetty 通过字节码扫描您部署的 web 应用程序以获取注释来发现您的服务器 WebSocket 端点,那么您还需要该annotations模块。

$ cd /path/to/mybase
$ java -jar /opt/jetty/jetty-home-9.4.14.v20181114/start.jar --add-to-start=annotations
$ grep "annotations" start.ini
--module=annotations

完成后,您可以执行以下一项(或多项)操作以将 websocket 服务器端点与您的 webapp 一起部署。

为什么这在独立的 Jetty 中有效?独立的 Jetty 做了什么来使这成为可能?

会发生以下情况:

  • websocket模块添加lib/websocket/*.jar到服务器类路径
  • 模块websocket依赖于和client模块annotations
  • client模块添加lib/jetty-client-<jetty.version>.jar到服务器类路径
  • annotations模块lib/jetty-annotations-<jetty.version>.jar和添加lib/annotations/*.jar到服务器类路径
  • annotations模块依赖于plus模块
  • annotations模块在etc/jetty-annotations.xml启动时选择执行
  • annotations模块按名称添加JPMS模块org.objectweb.asm
  • plus模块添加lib/jetty-plus-<jetty.version>.jar到服务器类路径
  • plus模块在etc/jetty-plus.xml启动时选择执行
  • plus模块依赖于, server, security,jndi和模块webapptransactions

(我将跳过以这种方式选择的其余模块)

简而言之,只需添加websocket模块,您就可以获得以下服务器类路径条目

lib/websocket/*.jar
lib/jetty-client-<jetty.version>.jar
lib/jetty-annotations-<jetty.version>.jar
lib/annotations/*.jar
lib/jetty-plus-<jetty.version>.jar

以及以下 XML 文件

lib/jetty-annotations.xml
lib/jetty-plus.xml

这两个 XML 文件都只是修改了Configuration服务器端的默认列表,使Configuration它们引入的行为可用于所有已部署的 WebApp。

您也可以为 webapp 特定行为设置(Configuration在它开始之前)。WebAppContext

例子:

WebAppContext context = new WebAppContext();
context.setContextPath("/");
context.setBaseResource(Resource.newResource(rootResourceUrl));

context.setConfigurations(new Configuration[] {
            new AnnotationConfiguration(),
            new WebXmlConfiguration(),
            new WebInfConfiguration(),
            new PlusConfiguration(), 
            new MetaInfConfiguration(),
            new FragmentConfiguration(), 
            new EnvConfiguration()});    

handlerList.addHandler(context);

注意:javax.websocket必须使用WebAppContext,因为为其初始化定义的行为需要完整的 Web 应用程序才能运行。虽然您可以使用ServletContextHandler带有javax.websocket端点的 a,但这种样式是 100% 手动定义、初始化和声明的,没有 JSR-356 依赖的自动字节码/注释扫描功能。

您也可以从命令行看到所有这些。

显示活动${jetty.base}配置,XML 属性值是什么,服务器类路径是什么,以及将执行什么 XML(以及以什么顺序!!)

$ cd /path/to/mybase
$ java -jar /opt/jetty/jetty-home-9.4.14.v20181114/start.jar --list-config

显示模块列表以及它们之间的关系(以及在您的${jetty.base}配置中选择了哪些模块)

$ cd /path/to/mybase
$ java -jar /opt/jetty/jetty-home-9.4.14.v20181114/start.jar --list-modules
于 2018-11-28T13:58:02.873 回答