
本教程详细介绍了如何在wildfly 27环境下正确配置eclipselink 4作为jpa持久化提供程序。文章针对从wildfly 26迁移时可能遇到的`persistenceprovider`未找到及`noclassdeffounderror`等问题,提供了具体的`module.xml`配置方案,强调了新增`java.rmi`和`java.desktop`模块依赖的重要性,确保eclipselink在jakarta ee 10兼容的wildfly 27上稳定运行。
当将基于EclipseLink的应用程序从WildFly 26.1.2.Final迁移到WildFly 27.0.0.Final时,开发者可能会遇到部署失败的问题。这通常是由于WildFly 27升级到Jakarta EE 10,导致模块依赖和类加载机制发生变化,特别是对于第三方JPA提供程序如EclipseLink。本文将详细阐述如何正确配置WildFly 27以支持EclipseLink 4。
在迁移过程中,常见的错误信息包括:
jakarta.persistence.PersistenceException: WFLYJPA0057: PersistenceProvider 'org.eclipse.persistence.jpa.PersistenceProvider' not found 此错误表明WildFly无法找到persistence.xml中指定的EclipseLink PersistenceProvider。尽管EclipseLink JAR文件可能已放置在正确的位置,但模块系统未能正确加载其类。
java.lang.NoClassDefFoundError: java/rmi/RemoteException 当尝试使用较新版本的EclipseLink(如3.0.3或4.0.0)时,可能会出现此错误。这通常是由于EclipseLink内部依赖了某些Java SE模块(如RMI和Desktop相关的类),而这些模块在WildFly的默认模块配置中并未被显式声明为EclipseLink模块的依赖。
最初的配置尝试可能包括将eclipselink-2.7.8.jar复制到WildFly模块目录并修改module.xml,如下所示:
<!-- 原始尝试的 module.xml 片段 (可能存在问题) -->
<resources>
    <resource-root path="jipijapa-eclipselink-27.0.0.Final.jar"/>
    <resource-root path="eclipselink-2.7.8.jar">
        <filter>
            <exclude path="javax/**" />
        </filter>
    </resource-root>
</resources>
<dependencies>
    <!-- ...其他依赖... -->
    <module name="jakarta.persistence.api"/>
    <!-- ...其他依赖... -->
</dependencies>以及应用程序的persistence.xml:
<persistence
    version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="jee2ap102-ejb-pu" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/jee2ap102</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.target-server" value="JBoss"/>
            <property name="eclipselink.weaving" value="static"/>
        </properties>
    </persistence-unit>
</persistence>尽管persistence.xml中的provider声明正确,且EclipseLink JAR存在,但由于模块依赖缺失,WildFly 27无法正确加载和初始化EclipseLink。
解决此问题的关键在于正确配置WildFly的模块系统,以确保EclipseLink及其所有运行时依赖都能被正确加载。这通常涉及更新org.eclipse.persistence模块的module.xml文件,并确保使用与WildFly 27兼容的EclipseLink版本(推荐EclipseLink 4.x)。
以下是针对WildFly 27和EclipseLink 4.0.0(或更高版本)的推荐module.xml配置:
下载EclipseLink 4.0.0或更高版本的JAR文件(例如 eclipselink-4.0.0.jar)。
确保EclipseLink模块目录存在。如果不存在,请创建以下目录结构: C:\wildfly-27.0.0.Final\modules\system\layers\base\org\eclipse\persistence\main
将下载的eclipselink-4.0.0.jar文件和WildFly自带的jipijapa-eclipselink-27.0.1.Final.jar(或对应版本)放置到上述main目录中。
在main目录下创建或修改module.xml文件,内容如下:
<module name="org.eclipse.persistence" xmlns="urn:jboss:module:1.9">
    <properties>
        <property name="jboss.api" value="public"/>
    </properties>
    <resources>
        <!-- WildFly JPA集成模块,版本需与WildFly匹配 -->
        <resource-root path="jipijapa-eclipselink-27.0.1.Final.jar"/>
        <!-- 添加EclipseLink库,使用4.x版本 -->
        <resource-root path="eclipselink-4.0.0.jar"/>
    </resources>
    <dependencies>
        <module name="java.logging"/>
        <module name="java.management"/>
        <module name="java.naming"/>
        <!-- 解决 java/rmi/RemoteException 错误,EclipseLink 运行时可能依赖 -->
        <module name="java.rmi"/>
        <!-- 解决其他潜在的 NoClassDefFoundError,EclipseLink 可能依赖 -->
        <module name="java.desktop"/>
        <module name="jakarta.annotation.api"/>
        <module name="jakarta.enterprise.api"/>
        <module name="jakarta.json.api" optional="true"/>
        <module name="jakarta.persistence.api"/>
        <module name="jakarta.transaction.api"/>
        <module name="jakarta.validation.api"/>
        <module name="jakarta.xml.bind.api"/>
        <module name="org.antlr"/>
        <module name="org.jboss.as.jpa.spi"/>
        <module name="org.jboss.logging"/>
        <module name="org.jboss.vfs"/>
    </dependencies>
</module>关键修改点说明:
应用程序的persistence.xml文件通常无需修改,只要provider标签指向正确的EclipseLink PersistenceProvider类即可。
<persistence
    version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="jee2ap102-ejb-pu" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/jee2ap102</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.target-server" value="JBoss"/>
            <property name="eclipselink.weaving" value="static"/>
        </properties>
    </persistence-unit>
</persistence>完成上述配置后,重新启动WildFly服务器并部署应用程序。此时,EclipseLink 4应该能够被WildFly 27正确识别和加载。
注意事项:
在WildFly 27中配置EclipseLink 4需要对模块系统有清晰的理解。通过正确地更新module.xml文件,特别是添加java.rmi和java.desktop等必要的JDK模块依赖,可以有效解决PersistenceProvider未找到和NoClassDefFoundError等部署问题。遵循本教程的步骤,将有助于您在最新的WildFly环境中成功集成和运行基于EclipseLink的应用程序。
以上就是WildFly 27集成EclipseLink 4:模块配置详解的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号