我正在遷移OSGi(Equinox)和Pax-web上運行的現有GWT應用程序,以使用聲明式服務而不是程序式服務跟蹤器。使用聲明式服務在OSGi + Pax-Web中GWT的問題
我在Equinox中使用Pax-Web。基於WAR的GWT應用程序通過PAX-WEB War extender加載沒有問題,但是您無法使用聲明式服務進行此操作。
我成功地將所有servlet重構出戰爭並將它們轉換爲聲明式OSGi服務(<provide interface="javax.servlet.Servlet"/>
)。這樣我擺脫了Servlet中所有混亂的ServiceTracker代碼和特定的OSGi依賴關係。 我進一步複製了所有其他的web.xml功能註冊一個過濾器,服務靜態內容和歡迎頁面使用的信息[1]
在這一點上,它通常應該工作, GWT嘗試加載資源的方式:
加載序列化描述符時,GWT從本地上下文加載序列化策略文件。 在我的情況下,它試圖解決這樣的資源:/ctx/ctx/62394587E47773FB1594FF.gwt.rpc 這個資源是由GWT編譯器創建並劃歸: /戰/ CTX/CTX /資源...
之前,使用標準wab映射(Webapp-Context: /ctx, Webapp-Root: /war
)gwt會正確地找到它的資源。 現在,我使用的編程資源映射:
DefaultResourceMapping resourceMapping = new DefaultResourceMapping();
resourceMapping.setAlias("/ctx");
resourceMapping.setPath("/war");
GWT無法加載種源,併產生以下錯誤:
2012-06-20 12:46:36.283:INFO:/:AbcProxy: ERROR: The serialization policy file '/ctx/ctx/600000000000000773FB1594FF.gwt.rpc' was not found; did you forget to include it in this deployment?
2012-06-20 12:46:36.283:INFO:/:AbcProxy: WARNING: Failed to get the SerializationPolicy '600000000000000773FB1594FF' for module 'https://localhost:8443/ctx/ctx/'; a legacy, 1.3.3 compatible, serialization policy will be used. You may experience SerializationExceptions as a result.
[注:最後一句應該是「你將經歷一系列序列化問題」]
我已經跟蹤問題到HttpServiceContext加載資源,並將路徑解釋爲文件而不是作爲相對於URL的URL編程網絡方面:
getting resource: [/mx/mx/6ECAD5B3A6F908CE17E47773FB1594FF.gwt.rpc]
HttpServiceContext | not a URL or invalid URL: [/ctx/ctx/600000000000000773FB1594FF.gwt.rpc], treating as a file path
DefaultHttpContext | Searching bundle [bundle] for resource [/ctx/ctx/600000000000000773FB1594FF.gwt.rpc]
這顯然失敗了,因爲這樣的資源位於/捆綁文件系統戰/ CTX/CTX /。 這似乎涉及到錯誤PAXWEB-314 [2],它的實現是把相對路徑到一個文件路徑:
// IMPROVEMENT start PAXWEB-314
257 try {
258 resource = new URL(path);
259 LOG.debug("resource: [" + path + "] is already a URL, returning");
260 return resource;
261 }
262 catch (MalformedURLException e) {
263 // do nothing, simply log
264 LOG.debug("not a URL or invalid URL: [" + path + "], treating as a file path");
265 }
266 // IMPROVEMENT end PAXWEB-314
有沒有辦法來解決這個問題?有人使用OSGi DS而不是WAB使用GWT和PAX-WEB? 一種可能的方法是將GWT編譯器生成的/ war/ctx複製回/ ctx,但在進入黑客方向之前,我想找到一個體面的解決方案。
任何想法?
1 - https://github.com/ops4j/org.ops4j.pax.web/blob/master/samples/whiteboard/src/main/java/org/ops4j/pax/web/extender/samples/whiteboard/internal/Activator.java [2] - http://team.ops4j.org/browse/PAXWEB-314
似乎在OSGi容器中使用時等存在與類加載和GWT的問題。這可能與您的問題有關。 [GWT Issue 1888](http://code.google.com/p/google-web-toolkit/issues/detail?id=1888)和[GWT OSGI on clazzes.org](http://svn.clazzes。 org/svn/gwt/tags/gwt-osgi-2.4.0.2 /)可能會令你感興趣。 – pauli
@pauli謝謝。我按照PAX-WEB處理Web應用程序上下文的方式來追蹤問題。基本上,當你有一個war文件時,你可以將'Webapp-Context'設置爲。 GWT使用'String contextPath = request.getContextPath();'來構建編譯資源的位置,但是由於PAX-WEB沒有提供這個位置,所以GWT沒有找到它。我們通過手動將編譯的資源複製到'..'來解決這個問題 –
maasg