我想将包含web.xml
且打包为WAR的webapp部署到Jetty服务器。
在该应用程序中,我希望能够配置一个JSR-356指定的javax websocket端点。我希望这些端点通过ServerEndpointConfig
提供,不是注释扫描。
有很多资源可以利用嵌入式Jetty,利用已经著名的WebSocketServerContainerInitializer.configureContext(context);
API来举例说明。显然,我做不到。
还有其他人,直接跳到ServletContextListener
并通过著名的ServerContainer
获得context.getAttribute("javax.websocket.server.ServerContainer"
)。到目前为止,我已经通过该API获得了NULL
的收益,因此显然没有添加容器。
缺少哪些配置?是否可以最好通过web.xml
完成?如果是与jetty.xml
或jetty.ini
之类的配置文件有关的,则示例同样会很好,最好使用xml
语法。
按照下面的答案(已接受的答案),正如我实际上试图在此处描述的那样-已知的配置方式绝对可以正常工作。说出已知的意思是通过将--module=websocket
添加到某个非嵌入式Jetty的*.ini
文件中,或调用WebSocketServerContainerInitializer.configureContext
来嵌入一个文件。
所以改写这个问题:有人通过纯XML
的配置启用websocket模块是否有任何经验/知识?
答案 0 :(得分:1)
如果使用${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应用一起部署。
@ServerEndpoint
(来自javax.websocket.server.ServerEndpoint
)为班级添加注释javax.websocket.server.ServerApplicationConfig
的实现,并返回您要部署Jetty的服务器端点。ServletContext.getAttribute("javax.websocket.server.ServerContainer")
获取javax.websocket.server.ServerContainer
,并使用其addEndpoint()
方法。请注意,这只能通过ServletContextListener.contextInitialized(ServletContextEvent sce)
或ServletContainerInitializer.onStartup(Set<Class<?>> c, ServletContext ctx)
为什么这在独立的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
模块按名称org.objectweb.asm
添加JPMS模块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
(在启动之前)针对Webapp特定的行为。
示例:
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 App才能起作用。 尽管您可以将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