我正试图从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类,但我不确定应该是什么。有什么建议吗?
答案 0 :(得分:3)
所以在拼凑了各种关于配置码头的帖子的解决方案之后,通过一些试验和错误,我得到了这个。我必须遵循的步骤是:
<?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会选择它们。