gpt4 book ai didi

java - 在 OSGI 4.2 包中使用 JAX-WS 时出现 NoClassDefFoundError

转载 作者:太空宇宙 更新时间:2023-11-04 15:08:16 24 4
gpt4 key购买 nike

我的任务是更新 Cytoscape 的插件,一个生物可视化软件平台,更新到最新版本的 Cytoscape API。 Cytoscape 3.x 使用 OSGI 框架(我认为是 Karaf 2.2.x)与其插件(现在称为“应用程序”)进行交互。

问题在于插件/应用程序使用 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 和/或实现类直接嵌入到 bundle 中,但这没有帮助。我还尝试使用 org.osgi.framework.system.packages.extra 和 org.osgi.framework.bootdelegation 属性,但无济于事。不过,我可能做错了什么。

我担心 OSGI 可能与用于创建该 header 的 Reflection API 存在一些基本的不兼容性。但在这种环境中运行 Web 服务客户端肯定不是不可能的,对吗?

最佳答案

看起来 JAX-WS 正在将构建时不存在的依赖项动态地编织到您的包中。由于这些依赖项是动态的,因此构建工具找不到它们,也不会为它们生成 Import-Package 语句。

具体来说,您的 bundle 依赖于com.sun.xml.internal.ws.api.message包。您从来没有想要或要求过这种依赖关系,但 JAX-WS 无论如何都为您添加了它。多好啊!

您的问题表明您正在使用 Maven 和 maven-bundle-plugin 来构建您的包。因此你需要在你的 pom 中添加这样的内容:

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

请注意,可能还有其他软件包需要添加到此列表中...添加此软件包后您可能会发现它们。同样,因为这些是动态编织的依赖项,所以不可能提前获得它们的完整列表。

关于你的最后一个问题。你是对的,在这种环境下运行 Web 服务客户端当然不是不可能的!然而,OSGi 确实倾向于暴露无效的假设和不良的编码实践,这些通常出现在像 JAX-WS 这样的蹩脚库中。

关于java - 在 OSGI 4.2 包中使用 JAX-WS 时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com