如何让 eclipse-jetty 插件扫描和识别 websocket 类?

Posted

技术标签:

【中文标题】如何让 eclipse-jetty 插件扫描和识别 websocket 类?【英文标题】:How do I get the eclipse-jetty plugin to scan for and recognize websocket classes? 【发布时间】:2014-01-25 17:29:10 【问题描述】:

我正在尝试从 eclipse Indigo 启动一个简单的 java maven webapp,它只包含一个类,一个基本的带注释的 websocket。我希望注释扫描使用 sourceforge eclipse-jetty plugin 自动识别和注册类,该类配置为使用我自己的本地码头分布 9.1.1.v20140108。 websocket的代码如下:

package com.myapp.websocket_sample;

import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/ws/broadcast", encoders = , decoders = )
public class TestWebsocket 
    private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
    private static final Logger logger = LoggerFactory.getLogger(TestWebsocket.class);

    public TestWebsocket() 
        logger.info("Initializing websocket.");
    

    @OnOpen
    public void onOpen(final Session session) 
        logger.info("Opening new websocket session.");
        sessions.add(session);
    

    @OnClose
    public void onClose(final Session session) 
        logger.info("Closing new websocket session.");
        sessions.remove(session);
    

    @OnMessage
    public void onMessage(final String message, final Session client) throws IOException, EncodeException 
        logger.info("Got message .", message);
        for (final Session session : sessions) 
            session.getBasicRemote().sendObject(message);
        
    

在 eclipse-jetty 下启动时,websocket 类显然没有被 jetty 识别和扫描。在查看 eclipse-jetty 插件使用的(自动生成的)jetty.xml 时,该类似乎位于 extraClasspath 选项上。

<Set name="handler">
    <New class="org.eclipse.jetty.webapp.WebAppContext">
        <Arg type="String">src/main/webapp</Arg>
        <Arg type="String">/ws-sample</Arg>
        <Set name="extraClasspath">C:/Users/padolan/AppData/Local/eclipse-workspaces/websockets/websocket-sample/target/classes;C:/Users/padolan/.m2/repository/javax/websocket/javax.websocket-api/1.0/javax.websocket-api-1.0.jar;C:/Users/padolan/.m2/repository/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar</Set>
    </New>
</Set>

我可以使用相同的项目(使用 maven 构建为 war 文件),将其复制到 jetty 发行版的 webapps 文件夹,然后使用 jetty start.jar 像这样启动它,然后 websocket 被拾取并可用:

java -jar start.jar --module=webapp,websocket

我怀疑我需要在 eclipse-jetty 插件的类路径中添加一些特殊的 jetty 配置或其他类,以使其获取带注释的 websocket 类,但我不确定应该是什么。有什么建议吗?

【问题讨论】:

【参考方案1】:

因此,在将有关配置码头的各种帖子中的解决方案拼凑在一起,并通过一些试验和错误之后,我得到了这个工作。我必须遵循的步骤是:

    创建一个新的 eclipse-jetty 运行配置并将 eclipse-jetty 指向新的 jetty 发行版(eclipse-jetty 插件支持的标准功能)。 将 websocket 类(和其他依赖类)添加为 eclipse-jetty 插件中的自定义类路径引导条目。 虽然我最终在其中添加了所有 jetty 分发 jar,但这可能有点矫枉过正,你可以弄清楚哪些是真正需要的。 创建并引用一个新的自定义 jetty.xml 配置,该配置添加了正确的注释扫描配置类。 这必须作为另一个码头上下文配置添加到 eclipse-jetty 插件的运行配置窗口中,低于标准“Eclipse Jetty Launcher Context”条目(这是一个自动生成的 jetty.xml 文件,您无法更改)。我使用的实际文件如下所示:
<?xml version="1.0"?>
<!-- DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd" -->
<!DOCTYPE Configure [
<!ELEMENT Configure (Set*,Call*)>
<!ELEMENT Call (Arg*,Call*)>
<!ELEMENT Arg (#PCDATA|Ref|Array)*>
<!ELEMENT Array (Item+)>
<!ELEMENT Item (#PCDATA)>
<!ATTLIST Configure id CDATA "">
<!ATTLIST Configure class CDATA "">
<!ATTLIST Call class CDATA "">
<!ATTLIST Call name CDATA "">
<!ATTLIST Arg name CDATA "">
<!ATTLIST Array type CDATA "">
]>
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="configurationClasses">
<Array type="java.lang.String">
  <Item>org.eclipse.jetty.webapp.WebInfConfiguration</Item>
  <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>
  <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>
  <!-- <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>
  <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>
  <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item> -->
  <Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item>
  <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>
</Array>
</Set>
</Configure>

特别说明:我无法直接引用公共码头 dtd,因此我将嵌入式的 dtd 拼凑在一起,它允许 eclipse-jetty 加载配置而不会出错

就是这样(哈)!有了这个,我可以将新的带注释的 websocket 类(以及带注释的 servlet 类)添加到我的 Web 项目中,并且当使用 eclipse-jetty 运行配置启动时,jetty 会选择它们。

【讨论】:

以上是关于如何让 eclipse-jetty 插件扫描和识别 websocket 类?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 AnyLogic 识别 Lombok 插件?

如何让 Eclipse Pydev 插件识别新安装的 Python 模块?

Phonegap 条码扫描仪无法识别 windows phone 上的任何条码

Unity插件系列之二维码

微信小程序实现OCR扫描识别

发票二维码扫描增强_02_算法概述