如果使用${jetty.base} 和${jetty.home} recommended installation process for Standalone Jetty,您应该转到您的${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 服务器端点与您的 web 应用程序一起部署。
为什么这在独立的 Jetty 中有效?独立的 Jetty 做了什么来使这成为可能?
会发生以下情况:
-
websocket module 将lib/websocket/*.jar 添加到服务器类路径
-
websocket 模块依赖于 client 和 annotations 模块
-
client module 将lib/jetty-client-<jetty.version>.jar 添加到服务器类路径
-
annotations module 将lib/jetty-annotations-<jetty.version>.jar 和lib/annotations/*.jar 添加到服务器类路径中
-
annotations 模块依赖于plus 模块
-
annotations 模块选择 etc/jetty-annotations.xml 在启动时执行
-
annotations 模块按名称添加 JPMS 模块org.objectweb.asm
-
plus module 将lib/jetty-plus-<jetty.version>.jar 添加到服务器类路径
-
plus 模块选择 etc/jetty-plus.xml 在启动时执行
-
plus 模块依赖于 server、security、jndi、webapp 和 transactions 模块
(我将跳过以这种方式选择的其余模块)
简而言之,只需添加 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。
您也可以set the Configuration on the WebAppContext(在它开始之前)针对 web 应用的特定行为。
例子:
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 端点一起使用,但这种样式是 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