hibernate.org捆绑包“导入包”链接到rt.jar中的错误包javax.transaction,而不是jboss-transaction.jar

问题描述 投票:8回答:1

tl; dr:

  • 为什么即使我们在hibernate.org捆绑包中导入的javax.transaction包中的版本指令仅由自定义javax.transaction-bundle提供,也为什么不考虑我们的export包指令?
  • maven / eclipse / osgi中是否有一些工具可以帮助您理解依赖项/软件包的解决方案?
  • 我们正在使用Eclipse4,jdk1.8
  • 调试问题时很明显,javax.transaction仅由SystemBundleLoader提供,而不是我们自定义javax.transaction-Bundle的BundleLoader提供。

详细版本:我们目前正在尝试通过基本上使用bnd工具重新打包所有第三方库来创建OSGi捆绑包。当(重新)包装hibernate.org(5.3.7)时,我们面临hibernate.org库的import package指令的问题(java.lang.NoClassDefFoundError:javax / transaction / SystemException)。

  • hibernate.org库导入了一个名为javax.transaction的包
  • 此包由javax.transaction的jboss变体提供,我们将该库重新包装在一个名为“ javax.transaction”的构件中,当然会导出所需的包。
  • Java运行时(rt.jar,jdk 1.8.0_221)提供了称为“ javax.transaction”的相同程序包,但类较少

在我们的Maven构建中,运行surefire插件执行我们的插件测试时,我们遇到了java.lang.NoClassDefFoundError。

Jenkins控制台日志中部分减少的堆栈跟踪看起来像这样(表明使用休眠模式激活捆绑失败:]

!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)

跟随原因,激活失败的原因

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作为tycho配置的extraRequirements / requirement-entry放入,因为在测试执行期间无法解决传递性依赖项。但是,看起来rt.jar的javax.transaction-package优于我们javax.transaction.jar中的同一包。

org.hibernate捆绑软件具有以下依赖关系:

  • 它基本上导出所有org.hibernate。*软件包。
  • 它导入javax.transaction(.xa),net.bytebuddy。*,org.dom4j(.io)
java hibernate osgi maven-surefire-plugin
1个回答
0
投票
您在1个问题中有3个问题...但是要提供一个简单的答案,您的运行时中可能有> 1个javax.transaction,因此,如果您要为其提供自定义捆绑软件,就不要使用系统了。]
© www.soinside.com 2019 - 2024. All rights reserved.