2014-01-25 29 views
3

我試圖從eclipse Indigo啓動一個簡單的java maven webapp,它只包含一個類,一個基本的帶註釋的websocket。我希望註釋掃描能夠使用sourceforge eclipse-jetty plugin自動識別和註冊該類,它被配置爲使用我自己的本地碼頭分發9.1.1.v20140108。代碼的網頁套接字如下:如何獲得eclipse-jetty插件來掃描並識別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的碼頭開始,網頁套接字類顯然不被識別和碼頭掃描。在查看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戰爭文件),將其複製到碼頭分佈的webapps文件夾中,並使用碼頭start.jar像這樣啓動它,WebSocket的拾取並提供:

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

我懷疑我需要一些特殊的碼頭配置或其他類添加到Eclipse的插件碼頭的類路徑得到它拿起註釋WebSocket的類,但我不知道那應該是什麼。有什麼建議麼?

回答

3

因此,在將各種帖子的解決方案拼湊在碼頭上並通過一些試驗和錯誤後,我得到了這個工作。我只好跟着的步驟是:

  1. 創建一個新的Eclipse-碼頭運行配置和Eclipse的碼頭指向新的碼頭分佈(由Eclipse的插件碼頭支持的標準功能)。
  2. 將websocket類(和其他相關類)添加爲eclipse-jetty插件中的自定義類路徑引導條目。雖然我最終添加了所有的碼頭分配罐,但這可能是過量的,你可以找出哪些是非常必要的。
  3. 創建並引用新的自定義jetty.xml配置,該配置添加了正確的註釋掃描配置類。這必須作爲eclipse-jetty插件的運行配置窗口中的標準「Eclipse Jetty啓動程序上下文」條目(這是您不能更改的自動生成的jetty.xml文件)下的另一個jetty上下文配置添加。我使用的實際文件看起來像下面這樣:
<?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的碼頭裝載配置沒有錯誤

就是這樣(ha)!有了這個,我可以將新的帶註釋的websocket類添加到我的web項目(以及註釋的servlet類),並且jetty會在使用eclipse-jetty運行配置啓動時選擇它們。