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

Posted

技术标签:

【中文标题】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 【发布时间】:2020-05-21 01:09:26 【问题描述】:

tl;博士:

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

长版: 我们目前正在尝试通过基本上使用 bnd 工具重新打包它们来从我们所有的 3rd 方库创建 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)

是的,org.hibernate_5.3.7.v20200129-1820.jar 中不存在 javax.transaction.SystemException 类,但在我们/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)

【问题讨论】:

您能否提供一个构建脚本或如何为org.hibernate_5.3.7.v20200129-1820 配置捆绑类路径。 对于 maven 依赖 mvn dependency:tree -Dverbose maven.apache.org/plugins/maven-dependency-plugin/examples/… 对于类加载器 ***.com/a/60282319/9466638 @SubOptimal:我将休眠包的 im-/exports 添加到原始问题中。 【参考方案1】:

1 中有 3 个问题...但要提供一个简单的答案,您的运行时可能有 >1 javax.transaction,因此如果您要为其提供自定义捆绑包,请摆脱系统问题。

您可以尝试从 jre.properties 中的包中删除 javax.transaction(和朋友)

【讨论】:

以上是关于hibernate.org 捆绑“导入包”链接到 rt.jar 中的错误包 javax.transaction 而不是 jboss-transaction.jar的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate

私人包裹的处理方式是啥?

java项目(java project)如何导入jar包?

java需要加入啥包?

Hibernate

hibernate配置IDEA