hibernate.org Пакет «import package» ссылается на неправильный пакет javax.transaction в rt.jar вместо jboss -action.jar - PullRequest
8 голосов
/ 05 февраля 2020

tl; dr:

  • Почему наша директива пакета экспорта не учитывается, даже если мы импортируем пакет javax.transaction в наш пакет hibernate.org с помощью директивы version, которая только предоставляется нашим пользовательским javax.transaction-bundle?
  • Есть ли в maven / eclipse / osgi какие-либо инструменты, помогающие понять разрешение зависимостей / пакетов?
  • Мы используем Eclipse4, jdk1.8
  • При отладке проблемы становится ясно, что javax.transaction предоставляется только SystemBundleLoader вместо BundleLoader нашего пользовательского javax.transaction-Bundle.

длинная версия: В настоящее время мы пытаемся создать пакеты OSGi из всех наших сторонних библиотек, в основном используя инструменты bnd для их переупаковки. При (пере) упаковке hibernate.org (5.3.7) мы сталкиваемся с проблемой (java .lang.NoClassDefFoundError: javax / транзакция / SystemException) с директивой пакета импорта библиотеки hibernate.org.

  • библиотека hibernate.org импортирует пакет с именем javax.transaction
  • этот пакет предоставляется вариантом jboss javax.transaction, и мы повторно упаковываем эту библиотеку в артефакт под названием "javax". .transaction "и, конечно, экспортируйте нужный пакет.
  • среда выполнения java (rt.jar, jdk 1.8.0_221) предоставляет тот же пакет, который называется" javax.transaction ", но с меньшим количеством классов

В нашей сборке maven мы запускаем java .lang.NoClassDefFoundError при запуске плагина surefire для выполнения наших тестов плагинов.

Частично сокращенная трассировка стека из журнала консоли Jenkins выглядит вот так (показывая, что активация пакета с помощью hibernate не удалась):

!ENTRY org.eclipse.osgi 4 0 2020-01-30 11:39:27.329!MESSAGE An error occurred while automatically activating bundle some.company.bundle (51).
!STACK 0
org.osgi.framework.BundleException: Exception in some.other.company.bundle.Activator.start() of bundle some.other.company.bundle
    at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:803)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:732)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1005)
    at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:357)
    at org.eclipse.osgi.container.Module.doStart(Module.java:588)
    at org.eclipse.osgi.container.Module.start(Module.java:456)
    at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:471)
    at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:117)
    at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:557)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:331)
    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:395)
    at org.eclipse.osgi.internal.loader.sources.SingleSourcePackage.loadClass(SingleSourcePackage.java:39)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:469)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:414)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:153)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at  at some.other.company.bundle.AConstructorOfClassUsingHibernateStuff
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at some.other.company.bundle...
    at some.other.company.bundle...
    at some.other.company.bundle...
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:782)
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:775)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:732)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1005)
    at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:357)
    at org.eclipse.osgi.container.Module.doStart(Module.java:588)
    at org.eclipse.osgi.container.Module.start(Module.java:456)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:431)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:450)
    at org.eclipse.tycho.surefire.osgibooter.OsgiSurefireBooter.getBundleClassLoader(OsgiSurefireBooter.java:179)
    at org.eclipse.tycho.surefire.osgibooter.OsgiSurefireBooter.createCombinedClassLoader(OsgiSurefireBooter.java:117)
    at org.eclipse.tycho.surefire.osgibooter.OsgiSurefireBooter.run(OsgiSurefireBooter.java:110)
    at org.eclipse.tycho.surefire.osgibooter.HeadlessTestApplication.run(HeadlessTestApplication.java:21)

Caused by: java.lang.NoClassDefFoundError: javax/transaction/SystemException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.jboss.logging.Logger$1.run(Logger.java:2554)
at java.security.AccessController.doPrivileged(Native Method)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2529)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
at org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:28)
at org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:24)
at org.hibernate.type.spi.TypeConfiguration.<clinit>(TypeConfiguration.java:59)

с указанием причины, по которой активация не удалась ed

Caused by: java.lang.ClassNotFoundException: javax.transaction.SystemException cannot be found by org.hibernate_5.3.7.v20200129-1820
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:460)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:414)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:153)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

И да, класс javax.transaction.SystemException не существует в org.hibernate_5.3.7.v20200129-1820.jar, но в нашем / jboss 'javax.transaction.jar. Поэтому мы помещаем javax.transaction.jar как запись extraRequirements / demand в конфигурацию Tycho, потому что переходные зависимости не разрешаются во время выполнения теста. Но все же кажется, что пакет javax.transaction из rt.jar предпочтительнее того же пакета в нашем javax.transaction.jar.

Пакет org.hibernate имеет следующие зависимости:

  • Экспортирует в основном все пакеты org.hibernate. *.
  • Импортирует javax.transaction (.xa), net .bytebuddy. *, Org.dom4j (.io)
...