簡體   English   中英

hibernate.org 捆綁“導入包”鏈接到 rt.jar 中的錯誤包 javax.transaction 而不是 jboss-transaction.jar

[英]hibernate.org Bundle "import package" links to a wrong package javax.transaction in rt.jar instead of the jboss-transaction.jar

tl;博士:

  • 為什么我們的導出包指令沒有被考慮在內,即使我們在 hibernate.org 包中導入 javax.transaction 包的版本指令僅由我們的自定義 javax.transaction-bundle 提供?
  • maven/eclipse/osgi 中是否有一些工具可以幫助理解依賴項/包的解析?
  • 我們使用的是Eclipse4,jdk1.8
  • 在調試問題時,很明顯,javax.transaction 僅由 SystemBundleLoader 提供,而不是由我們自定義的 javax.transaction-Bundle 的 BundleLoader 提供。

長版:我們目前正在嘗試從我們所有的 3rd 方庫中創建 OSGi 包,方法是基本上使用 bnd 工具重新打包它們。 當(重新)打包 hibernate.org (5.3.7) 時,我們面臨 hibernate.org 庫的導入包指令的問題(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 控制台日志中部分減少的堆棧跟蹤如下所示(表明使用 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)

其次是原因,激活失敗的原因

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/requirement-entry 放入 tycho 配置,因為在測試執行期間沒有解決傳遞依賴項。 但是,看起來 rt.jar 中的 javax.transaction-package 比我們的 javax.transaction.jar 中的同一個包更受歡迎。

org.hibernate 包具有以下依賴項:

  • 它導出基本上所有 org.hibernate.* 包。
  • 它導入 javax.transaction(.xa)、net.bytebuddy.*、org.dom4j(.io)

您在 1 中有 3 個問題...但是為了提供一個簡單的答案,您的運行時中可能有 >1 個 javax.transaction,因此如果您要為其提供自定義包,請擺脫系統一。

您可以嘗試從 jre.properties 中的包中刪除 javax.transaction(和朋友)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM