如何让 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 类?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Eclipse Pydev 插件识别新安装的 Python 模块?