如何配置wildfly以使用EclipseLink?

Posted

技术标签:

【中文标题】如何配置wildfly以使用EclipseLink?【英文标题】:How to configure wildfly to use EclipseLink? 【发布时间】:2014-11-04 04:30:55 【问题描述】:

我已经安装了wildfly 8.1,因为我已经有一个项目配置为使用EclipseLink,所以我尝试配置wildfly 以使用它。

但是,它总是给出同样的错误:

at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:166) [wildfly-server-8.1.0.Final.jar:8.1.0.Final]
 at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
 at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_25]
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_25]
 at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_25]
Caused by: javax.persistence.PersistenceException: JBAS011466: PersistenceProvider '
org.eclipse.persistence.jpa.PersistenceProvider
' not found
 at org.jboss.as.jpa.processor.PersistenceUnitServiceHandler.lookupProvider(PersistenceUnitServiceHandler.java:990)
 at org.jboss.as.jpa.processor.PersistenceUnitServiceHandler.addPuService(PersistenceUnitServiceHandler.java:258)
 at org.jboss.as.jpa.processor.PersistenceUnitServiceHandler.handleWarDeployment(PersistenceUnitServiceHandler.java:191)
 at org.jboss.as.jpa.processor.PersistenceUnitServiceHandler.deploy(PersistenceUnitServiceHandler.java:126)
 at org.jboss.as.jpa.processor.PersistenceBeginInstallProcessor.deploy(PersistenceBeginInstallProcessor.java:52)
 at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:159) [wildfly-server-8.1.0.Final.jar:8.1.0.Final]
 ... 5 more

我已按照official documentation 的指示进行操作,但没有任何改变。我已将 eclipseLink 的 jar 添加到“modules\system\layers\base\org\eclipse\persistence\main” 和 module.xml :

<module xmlns="urn:jboss:module:1.3" name="org.eclipse.persistence">
    <resources>
        <resource-root path="jipijapa-eclipselink-1.0.1.Final.jar"/>
        <resource-root path="eclipselink.jar"/>
    </resources>

    <dependencies>
        <module name="asm.asm"/>
        <module name="javax.api"/>
        <module name="javax.annotation.api"/>
        <module name="javax.enterprise.api"/>
        <module name="javax.persistence.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.validation.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="org.antlr"/>
        <module name="org.apache.commons.collections"/>
        <module name="org.dom4j"/>
        <module name="org.javassist"/>
        <module name="org.jboss.as.jpa.spi"/>
        <module name="org.jboss.logging"/>
        <module name="org.jboss.vfs"/>
    </dependencies>
</module>

你知道是什么问题吗?

Tks

编辑: 我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<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="AppPu">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>java:/H2Ds</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
    </persistence-unit>
</persistence>

【问题讨论】:

你能给我看看persistence.xml吗? 我编辑了我的帖子并添加了我的 persistence.xml 【参考方案1】:

persistence.xml 的 provider 部分中的新行不起作用(它有什么帮助?)。 Wildfly 没有在库中提供 eclipseLink 实现。要解决此问题,请按以下步骤操作:

    下载 eclipselink.jar(或从您的 maven 存储库中复制) 复制到 目的地 : ...Wildfly\modules\system\layers\base\org\eclipse\persistence\main 编辑 module.xml(相同路径)。添加部分 &lt;resource-root path="eclipselink.jar"&gt;&lt;filter&gt;&lt;exclude path="javax/**" /&gt;&lt;/filter&gt;&lt;/resource-root&gt;

服务器重启后一切正常。

【讨论】:

docs.jboss.org/author/display/WFLY10/…【参考方案2】:

我终于解决了这个问题!

其实我有一个复合单元,所有persistence.xml都是正确的,但是声明复合单元的persistence.xml是provider的错误声明:

<provider>
   org.eclipse.persistence.jpa.PersistenceProvider
</provider>

替换为:

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

现在可以正常工作了。

【讨论】:

这两种方式没有区别:使用换行符或不使用换行符。所以这不是解决你问题的方法。 对我来说,这有很大的不同!现在我部署没有错误。为了好玩,我尝试在提供者的标签后插入换行符,然后我重现了错误! 很奇怪。但是查看堆栈跟踪是有道理的【参考方案3】:

您需要在persistence.xml 中将提供者添加到持久化单元:

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

【讨论】:

哎呀! juste 复制/过去的错误,但我的 persistence.xml 包含提供者的声明!我解决了这个问题,我做出回应来解释它。【参考方案4】:

关于如何配置 eclipselin 模块的官方文档,以及激活 vfs acrhieve factory impl 所需的系统属性都在这里给出:

https://docs.jboss.org/author/display/WFLY10/JPA+Reference+Guide#JPAReferenceGuide-UsingEclipseLink

为模块做一些事情:

<module xmlns="urn:jboss:module:1.1" name="org.eclipse.persistence">
    <resources>
        <resource-root path="jipijapa-eclipselink-10.0.0.Final.jar"/>
        <resource-root path="eclipselink.jar">           
           <filter>
              <exclude path="javax/**" />
           </filter>
        </resource-root>
    </resources>

    <dependencies>
        <module name="asm.asm"/>
        <module name="javax.api"/>
        <module name="javax.annotation.api"/>
        <module name="javax.enterprise.api"/>
        <module name="javax.persistence.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.validation.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="javax.ws.rs.api"/>
        <module name="org.antlr"/>
        <module name="org.apache.commons.collections"/>
        <module name="org.dom4j"/>
        <module name="org.jboss.as.jpa.spi"/>
        <module name="org.jboss.logging"/>
        <module name="org.jboss.vfs"/>
    </dependencies>
</module>

对于系统属性执行如下操作:

<system-properties>
   ...
   <property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
</system-properties>

最后,不要开始向您的 persistence.xml 添加任何容器特定属性,例如:

<property name="eclipselink.target-server" value="JBoss" />

这是完全错误的。 Wildfly 已经在将适当的目标服务器平台放入其:

org.jipijapa.eclipselink.EclipseLinkPersistenceProviderAdaptor

这是他们班级的代码示例:

  @SuppressWarnings( "rawtypes", "unchecked" )
    @Override
    public void addProviderProperties(Map properties, PersistenceUnitMetadata pu) 
        if (!pu.getProperties().containsKey(ECLIPSELINK_TARGET_SERVER)) 
            properties.put(ECLIPSELINK_TARGET_SERVER, WildFlyServerPlatform.class.getName());
            properties.put(ECLIPSELINK_ARCHIVE_FACTORY, JBossArchiveFactoryImpl.class.getName());
            properties.put(ECLIPSELINK_LOGGING_LOGGER, JBossLogger.class.getName());
        
    

您可能希望确保调试这个类,以确保它被调用并使您的动态持久性单元属性都正确。 但是不要乱用特定于容器的 persistence.xml 属性。 Wildfly 做得很好,他们自己添加了它们。

所以只要遵循他们的文档,这是最好的建议。

【讨论】:

【参考方案5】:

在带有服务包的 EAP 中存在org.eclipse.persistence 模块实际上可能位于.overlays/ 树 (modules/system/layers/base/.overlays/) 中的陷阱。

【讨论】:

以上是关于如何配置wildfly以使用EclipseLink?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 WildFly 8.2.0 日志记录以仅在调试级别显示应用程序

如何配置 Wildfly 连接到 RabbitMQ?

Wildfly 9 上的部署失败

Wildfly - 配置 ActiveMQ 以使用 Postgres 日志

配置 Wildfly 10 以使用 Jackson(作为 JSON 提供程序)

Wildfly 图像和 http 访问以显示图像