在我的Eclipse运行时中,我有以下三个插件(简化文件名以提高可读性):
我自己的插件的依赖关系如下所示: 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