Eclipse / OSGi类加载问题 - 尝试加载具有两个版本的插件时的java.lang.LinkageError

时间:2010-10-01 00:50:03

标签: eclipse osgi classloader

在我的Eclipse运行时中,我有以下三个插件(简化文件名以提高可读性):

  • javax.wsdl.1.4.0.jar
  • javax.wsdl.1.5.1.jar
  • eclipse.wsdl.jar,对依赖项有版本限制:[1.4.0,1.5.0)

我自己的插件的依赖关系如下所示: eclipse.wsdl javax.wsdl:“1.4.0”

当我自己的插件尝试使用WSDLFactory类时,会抛出错误:

java.lang.LinkageError: loading constraint violation: loader "org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader@a7b0a7b" previously initiated loading for a different type with name "javax/wsdl/factory/WSDLFactory" defined by loader "org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader@7c647c64"

显然,我自己的插件加载了WSDLFactory的1.5.1版本,而eclipse.wsdl加载了WSDLFactory的1.4.0版本,这导致了冲突。如果我将我的插件的版本限制更改为[1.4.0,1.5.1],代码将正常工作。但是,这是不可接受的,因为我的代码需要支持Eclipse 3.5,它强制使用1.4.0的javax.wsdl.1.5.1 intead。

有没有办法强制我的代码使用eclipse.wsdl加载的WSDLFactory而不是尝试加载自己的代码?

如果可能的话,有没有办法强制加载最低版本(而不是最高版本)?

更新:我尝试了Require-Bundle和Import-Package,并在开发和发布环境中获得了不同的结果。 Require-Bundle对任何一个都不起作用。 Import-Package在开发环境中工作,但在发布环境中不工作。

我的问题是,虽然Require-Bundle会尝试加载插件的最高版本中的类,但Import-Package不会表现得那样吗?

以下是相应的MANIFEST.MF:

需要束:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test
Bundle-SymbolicName: wsdl.classloading.test; singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: wsdl.classloading.test.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.eclipse.wst.wsdl;bundle-version="1.1.202",
 javax.wsdl;bundle-version="1.4.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy

导入级封装:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test
Bundle-SymbolicName: wsdl.classloading.test; singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: wsdl.classloading.test.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.eclipse.wst.wsdl;bundle-version="1.1.202"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Import-Package: javax.wsdl,
 javax.wsdl.factory,
 javax.wsdl.xml

0 个答案:

没有答案