Проблема загрузки класса Eclipse / OSGi - java.lang.LinkageError при попытке загрузить плагин с двумя версиями - PullRequest
2 голосов
/ 01 октября 2010

В моей среде исполнения 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, что заставляет использовать javax.wsdl.1.5.1 intead 1.4.0.

Есть ли способ заставить мой код использовать WSDLFactory, загруженный eclipse.wsdl, вместо того, чтобы пытаться загрузить свой собственный?

И если это вообще возможно, есть ли способ принудительно загрузить пакет самой низкой (а не самой высокой) версии?

Обновление : я попробовал оба Require-Bundle и Import-Package и получил разные результаты в среде разработки и выпуска. Require-Bundle не работает ни для одного из них. Import-Package работает в среде разработчика, но не в среде выпуска.

У меня такой вопрос, хотя Require-Bundle будет пытаться загрузить классы, которые находятся в самой высокой версии плагина, разве Import-Package НЕ ведет себя так?

Ниже приведены соответствующие MANIFEST.MF:

Требовать-Bundle:

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
...