LinkageError выбрасывается при попытке передать экземпляр класса между 2 плагинами Eclipse - PullRequest
1 голос
/ 13 апреля 2010

Я нашел много людей с похожими проблемами, но без душевных настроений ... в основном у меня есть два плагина Eclipse, которые оба в своем классе используют один и тот же сосуд.

Плагин пользовательского интерфейса отвечает за плагин драйвера (реализует пользовательский драйвер ODA и пользовательский интерфейс для него). Оба полагаются на jar, содержащий некоторые другие мои классы, и называется plugin-dto.jar

Когда плагин пользовательского интерфейса вызывает метод в одном из классов в плагине Driver, который возвращает объект, класс которого найден в jar plugin-dto, я получаю сообщение об ошибке:

java.lang.LinkageError: Class com/test/reporting/NrDsDriverProvider violates loader constraints
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:183)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:576)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:546)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:477)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:465)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:445)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:211)
    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:381)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:457)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:398)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

Есть идеи, как мне обойти эту проблему?

Заранее спасибо.

1 Ответ

3 голосов
/ 13 апреля 2010

Проблема в том, что экземпляры классов, загруженных в два разных плагина, отличаются, даже если они пришли из одного и того же jar-файла. Загрузчик класса Eclipse Plugin делает то, что должен. Предполагая, что Плагин A и Плагин B оба пытаются получить доступ к одному и тому же экземпляру класса Z, есть несколько решений этой проблемы:

  • Создайте общий плагин, назовите его D, который содержит и экспортирует Z. Обновите плагины A и B, чтобы они не включали банку для Z, и вместо этого загрузите Z из D.

  • Настройте A и B для использования "Buddy Classloading", см. http://wiki.eclipse.org/index.php/Context_Class_Loader_Enhancements

...