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

时间:2014-01-25 17:29:11

标签: java eclipse maven websocket jetty

我正试图从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 个答案:

答案 0 :(得分:3)

所以在拼凑了各种关于配置码头的帖子的解决方案之后,通过一些试验和错误,我得到了这个。我必须遵循的步骤是:

  1. 创建一个新的eclipse-jetty运行配置,并将eclipse-jetty指向新的jetty发行版(eclipse-jetty插件支持的标准功能)。
  2. 在eclipse-jetty插件中添加websocket类(和其他依赖类)作为自定义类路径引导程序条目。虽然我最终在那里添加了所有的jetty分发包,但这可能有点过头了你可以找出哪些是真正必要的。
  3. 创建并引用新的自定义jetty.xml配置,该配置添加了正确的注释扫描配置类。这必须在eclipse-jetty插件的运行配置窗口中添加为另一个jetty上下文配置,低于标准的“Eclipse Jetty Launcher Context”条目(这是一个您无法更改的自动生成的jetty.xml文件)。我使用的实际文件如下所示:
  4. <?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,因此我一起攻击了嵌入式设备,允许eclipse-jetty无误地加载配置

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