2014-02-10 46 views
1

我一直在負責更新插件Cytoscape,生物可視化軟件平臺,到Cytoscape的API的最新版本。 Cytoscape 3.x使用OSGI框架(Karaf 2.2.x,我認爲)與其插件(現在稱爲「應用程序」)進行交互。的NoClassDefFoundError在使用JAX-WS在OSGi 4.2捆綁

的問題是,插件/應用程序使用JAX-WS與外部服務器進行通信,和JAX-WS似乎與在OSGi環境加載類的問題。

這裏是有問題的代碼片段:

public class AnatServerService extends Service { 
    @WebEndpoint(name = "AnatServerPort") 
    public AnatServerIfc getServerPort() { 
     AnatServerIfc port = super.getPort(new QName("network", "AnatServerPort"), AnatServerIfc.class); 
     ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, path); 
    return port; 
    } 
} 

這裏是由此導致的異常:

java.lang.NoClassDefFoundError: com.sun.xml.internal.ws.api.message.Header not found by AnatApp [168] 
    at com.sun.proxy.$Proxy64.<clinit>(Unknown Source) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at java.lang.reflect.Proxy.newInstance(Unknown Source) 
    at java.lang.reflect.Proxy.newProxyInstance(Unknown Source) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.createProxy(UnknownSource) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(Unknown Source) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(Unknown Source) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(Unknown Source) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(Unknown Source) 
    at javax.xml.ws.Service.getPort(Unknown Source) 
    at anat.ws.AnatServerService.getServerPort(AnatServerService.java:36) 
    at anat.task.AvailableNetworksTask.getAvailableNetworks(AvailableNetworksTask.java:39) 
    at anat.task.AvailableNetworksTask.run(AvailableNetworksTask.java:62) 
    at org.cytoscape.work.internal.sync.SyncTaskManager.execute(SyncTaskManager.java:86) 
    at anat.view.BackgroundDefinitionDialog$AvailableNetworksSwingWorker.doInBackground(BackgroundDefinitionDialog.java:1544) 
    at anat.view.BackgroundDefinitionDialog$AvailableNetworksSwingWorker.doInBackground(BackgroundDefinitionDialog.java:1535) 
    at javax.swing.SwingWorker$1.call(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at javax.swing.SwingWorker.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

我可以證實,該代碼確實OSGI外工作。

有什麼建議嗎?我嘗試過使用Embed-Dependency直接將JAX-WS API和/或實現類嵌入到包中,但這並沒有幫助。我也嘗試玩org.osgi.framework.system.packages.extraorg.osgi.framework.bootdelegation屬性,無濟於事。不過,我可能做錯了什麼。

恐怕OSGI可能被使用反射API的一些基本的不相容創建頭。但是,在這種環境下運行Web服務客戶端肯定不是不可能的,對吧?

回答

0

我已經解決了我自己的問題。事實證明,我編輯了org.osgi.framework.bootdelegation屬性的錯誤文件 - config.properties而不是custom.properties

雖然這仍然是一個長期的問題。我希望能夠分發此捆綁包而無需用戶編輯配置文件。

+0

不幸的是,我的短期問題還沒有結束。新問題在這裏:http://stackoverflow.com/questions/21706565/jax-ws-unmarshals-empty-objects-when-in-an-osgi-environment –

0

好像JAX-WS動態編織依賴到你的包中不存在在構建時。因爲這些依賴關係是動態的,所以構建工具找不到它們,並且不會爲它們生成Import-Package語句。

具體的束在封裝com.sun.xml.internal.ws.api.message的依賴。您從來不想要或不要求該依賴關係,但JAX-WS無論如何都會爲您添加它。它多好!

你的問題建議你使用Maven,使用Maven束-插件來構建你的包。因此,你需要像這樣添加到您的POM:

<Import-Package> 
    com.sun.xml.internal.ws.api.message, 
    * 
</Import-Package> 

注意,有可能是需要添加到這個列表其他包...你可能會找到它們加入這個之後。同樣,因爲這些是動態編織的依賴關係,所以不可能提前獲得它們的完整列表。

關於你最後的問題。你是對的,在這個環境中運行Web服務客戶端當然不是不可能的!然而,OSGi確實傾向於暴露無效的假設和糟糕的編碼實踐,這些實踐通常出現在像JAX-WS這樣糟糕的庫中。

+0

噢,我想我試着用'進口Package'嘗試過,但我很快把它放在一邊。我可能應該嘗試更多。 結果如下: 'org.osgi.framework.BundleException:包中的未解析約束AnatApp [168]:無法解析168.4:缺少需求[168.4]包; (package = com.sun.xml.internal.ws.api.message)' 也許我需要將這種方法與我已經嘗試過的一種方法結合起來。 –

+0

原來'Import-Package'沒有必要。看到我的答案。 –

0

我有同樣的問題。添加以下行來Felix的config.properties文件解決了這個問題:

org.osgi.framework.bootdelegation=com.sun.xml.internal.ws.*