当前位置: 首页 > 知识库问答 >
问题:

为什么TomEE类加载器进程没有从ears/lib中找到Hibernate类?

呼延震博
2023-03-14

我构建的经典ear应用程序包含子模块EJB(进入jar)和WEB(进入war)。

我将我的ear(JAR WAR)部署到TomEE中,并使用Hibernate JPA提供程序。我得到以下错误:

Caused by: java.lang.NoClassDefFoundError: org/hibernate/integrator/spi/Integrator

Hibernate jar进入ear/lib。还有hibernate-core-4.2.16。包含类org/hibernate/integrator/spi/integrator的Final。

所以我认为Tomee ClassLoader进程不会从我的ear/lib文件夹加载该类。

是这样吗?如果是,为什么?

请帮忙

共有1个答案

经景辉
2023-03-14

它不会从那里检测到它,因为这不是应该放置此类“全局”库的默认假设。TomEE参考文件说明:

至少三个类加载器:一个用于ear的类加载器,一个用于每个ejb jar,一个用于每个WAR文件。

正如我们从这段引文中了解到的,EAR应用程序,尤其是它的EAR模块,在容器启动时很早就用自己的类加载器实例进行初始化,在WAR初始化开始之前,用自己的类加载器进行初始化。

我猜您的EAR模块(jar文件中的模块)代表后端层模块,扫描Hibernate以加载相关的类文件。遗憾的是,它无法在类加载器的范围内“看到”它们。

然而,当您放置所有Hibernate JAR(以及所有可传递的依赖项,如antlr、dom4j、javassist等)时,它就会起作用根据TomEE目录布局,进入全局lib目录。无论如何,这更有意义,因为它可以被应用程序的不同部分重用,这些部分可以/将被捆绑到EAR中,可以部署,甚至可以在同一容器中运行完全不同的应用程序。因此,全局jar文件将在ejb模块的类路径中可用,因此可以在容器启动时启动Hibernate。

放置到容器范围的安装中后,您可以将Hibernate jars从捆绑到EAR/lib文件夹中删除(通过在Maven项目设置中的pom.xml中将其声明为提供的依赖项)。

这将-作为副作用也会大大减少您的EAR包大小,因为这些库现在是“全局”的。在运行时,您还会观察到我们减少了内存占用,因为Hibernate ORM的所有类文件只会在容器中加载一次,而不是多次加载不同的EAR或WAR包。

提示:

>

  • 使用TomEE-7时,我建议将Hibernate至少升级到4.3.11版本,因为4.3. x Hibernate JPA支持可用于规范的2.1版本。此外,如果您可以自由这样做,请尝试将您的应用程序迁移到Hibernate 5.2. x版本,因为它带来了很多改进。

    有关传递性Hibernate依赖项的完整列表,请在此处查看版本4.2. x或此处版本4.3. x的列表,类似于Hibernate 5.2. x。您只需要收集/捆绑引用的“编译依赖项”并将它们放入全局TomEE“lib”目录即可正常工作。

    还要将您在应用程序中使用的JDBC驱动程序放在全局lib文件夹中。

    希望有帮助。

  •  类似资料:
    • 据说 引导类加载器加载位于/jre/lib目录中的核心Java库。 null sun.misc.launcher$AppClassLoader@73d16e93 sun.misc.launcher$AppClassLoader@73d16e93 这很好。 现在,如果将Student Jar文件放入/jre/lib/ext中,输出为 我在想,在这种情况下,学生类应该从引导类加载器加载,为什么它是由应

    • 展示了如何调试问题,即PHP模块没有加载到PHP中。 我使用OpenSUSEV42。2个Linux操作系统,带有Apache Web服务器,PHP v7。1、Mysql。 因为它不提供PHPV7。1我需要,我构建了PHPV7。1来源。使用PHP-FPM。 我把它安装到 php.ini在: 我发现,opcache安装到 我编辑了php。ini并添加了以下行: 重新启动: 但我还是得到了以下结果: [

    • 我已经重新启动了nginx和php7.4-fpm。 xdebug 3看起来是基于以下内容安装的: phpinfo()中的Ini目录: 加载的配置文件 /etc/php/7.4/fpm/php.ini扫描此目录以查找其他. ini文件 /etc/php/7.4/fpm/conf.d解析 /etc/php/7.4/fpm/conf.d/10-opcache.ini, /etc/php/7.4/fpm/

    • 返回文件的URL。 starfxdemodoc.fxml为: 而StarfXDemodocController.java是这样的: 有谁能帮我一下吗? 编辑/更新: 根据james_d的评论(谢谢你James,显然我已经盯着这个问题太久了……),我修复了控制器中的明显错误,并将SimNameField设置为TextField,而不是Label(并更新了上面的代码块以反映这一点)。我还将异常处理更改

    • 正如你所看到的,詹金斯没有找到我的资源。 我错过了什么?

    • 问题内容: 我正在关注有关管道库插件的教程。我制作了一个包含以下文件的存储库: helloWorld.groovy包含: Test.groovy包含: 我安装了所有管道插件,尤其是工作流-cps-global-lib- plugin。然后,我创建了一个新的管道作业,在其中加载了此存储库并将脚本路径设置为Test.groovy。当我运行此作业时,出现以下错误: 为什么helloWorld步骤未定义?