在EAP 6.4.0中使用JPA 2.1 [英] Using JPA 2.1 in EAP 6.4.0

查看:85
本文介绍了在EAP 6.4.0中使用JPA 2.1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

到目前为止,我一直没有找到成功的解决方案.

我们正在将应用程序迁移到EAP 6.4.0,我们的应用程序依赖于JPA 2.1.但是,JBoss是Java EE 6服务器,因此以模块的形式包含JPA 2.0.

我试图直接在我的WEB-INF/lib目录中包含JPA API jar,以为类加载器比系统上的更喜欢该类加载器.

我试图在我的耳朵中包含一个jboss-deployment-structure.xml文件.我在ear/META-INF,ear/war/META-INF和ear/war/WEB-INF下尝试过.

在jboss-deployment-structure.xml文件中,我尝试执行以下操作: 排除javax.persistence.api模块 使用JPA 2.1创建我自己的模块并为其添加依赖项 排除jpa子系统

我还尝试将位于jboss-eap-6.4.0 \ modules \ system \ layers \ base \ javax \ persistence \ api \ main <下的javax.persistence.api module.xml文件中的export属性设置为false. /p>

我尝试从standalone.xml中删除jpa子系统.

所有这些事情导致使用了JPA 2.0 jar.

使它起作用的唯一方法是替换模块目录(jboss-eap-6.4.0 \ modules \ system \ layers \ base \ javax \ persistence \ api \ main)中的实际jar.但这不是一个有效的解决方案,因为服务器中的其他应用或服务可能实际上需要旧版本的API.

有没有办法正确执行此操作(无需迁移到另一台服务器或更改代码)?

解决方案

请查看: https://issues.jboss.org/browse/WFCORE-209

这是来自上面链接的副本:

解决方法1

按如下所示更新javaee/api/main.module.xml:

<!--<module name="javax.persistence.api" export="true"/>-->

尽管这是不可移植的.

解决方法2

按如下所示更新jboss-deployment-structure.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="jpa" />
        </exclude-subsystems>
        <exclusions>
            <!-- WFCORE-209 workaround -->
            <module name="javaee.api" />
            <!-- --------------------- -->
            <module name="javax.persistence.api" />
            <module name="org.hibernate" />
        </exclusions>
        <dependencies>
            <!-- WFCORE-209 workaround -->
            <module name="javax.activation.api" export="true"/>
            <module name="javax.annotation.api" export="true"/>
            <module name="javax.ejb.api" export="true"/>
            <module name="javax.el.api" export="true"/>
            <module name="javax.enterprise.api" export="true"/>
            <module name="javax.enterprise.deploy.api" export="true"/>
            <module name="javax.inject.api" export="true"/>
            <module name="javax.interceptor.api" export="true"/>
            <module name="javax.jms.api" export="true"/>
            <module name="javax.jws.api" export="true"/>
            <module name="javax.mail.api" export="true"/>
            <module name="javax.management.j2ee.api" export="true"/>
            <!-- <module name="javax.persistence.api" export="true"/> -->
            <module name="javax.resource.api" export="true"/>
            <module name="javax.rmi.api" export="true"/>
            <module name="javax.security.auth.message.api" export="true"/>
            <module name="javax.security.jacc.api" export="true"/>
            <module name="javax.servlet.api" export="true"/>
            <module name="javax.servlet.jsp.api" export="true"/>
            <module name="javax.transaction.api" export="true"/>
            <module name="javax.validation.api" export="true"/>
            <module name="javax.ws.rs.api" export="true"  services="export"/>
            <module name="javax.xml.bind.api" export="true"/>
            <module name="javax.xml.registry.api" export="true"/>
            <module name="javax.xml.soap.api" export="true"/>
            <module name="javax.xml.ws.api" export="true"/>

            <!-- This one always goes last. -->
            <module name="javax.api" export="true"/>
            <!-- --------------------- -->
        </dependencies>
    </deployment>
</jboss-deployment-structure>

这是完全可移植的

I searched for a solution for this problem without having success so far.

We're migrating our aplications over to EAP 6.4.0, and our applications relies on JPA 2.1. However, JBoss is a Java EE 6 server, and therefore includes JPA 2.0 in the form of a module.

I tried including the JPA API jar directly in my WEB-INF/lib directory, thinking the classloader would prefer this one over the one from the system.

I have tried to include a jboss-deployment-structure.xml file in my ear. I tried it under ear/META-INF, ear/war/META-INF, and ear/war/WEB-INF.

In the jboss-deployment-structure.xml file, I tried to: exclude the javax.persistence.api module create my own module with JPA 2.1 and add a dependency to it exclude the jpa subsystem

I also tried to set the export attribute to false in the javax.persistence.api module.xml file located under jboss-eap-6.4.0\modules\system\layers\base\javax\persistence\api\main

I tried removing the jpa subsystem from the standalone.xml.

All of these things resulted in the JPA 2.0 jar being used.

The only way I got it to work was to replace the actual jar in the module directory (jboss-eap-6.4.0\modules\system\layers\base\javax\persistence\api\main). But that's not a valid solution as other apps or services in the server may actually need the old version of the API.

Is there a way to do this correctly (without migrating to another server nor changing the code)?

解决方案

Please take a look at: https://issues.jboss.org/browse/WFCORE-209

This is a copy from the link above:

workaround 1

update the javaee/api/main.module.xml as followed:

<!--<module name="javax.persistence.api" export="true"/>-->

though this is non-portable.

workaround 2

update jboss-deployment-structure.xml as followed:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="jpa" />
        </exclude-subsystems>
        <exclusions>
            <!-- WFCORE-209 workaround -->
            <module name="javaee.api" />
            <!-- --------------------- -->
            <module name="javax.persistence.api" />
            <module name="org.hibernate" />
        </exclusions>
        <dependencies>
            <!-- WFCORE-209 workaround -->
            <module name="javax.activation.api" export="true"/>
            <module name="javax.annotation.api" export="true"/>
            <module name="javax.ejb.api" export="true"/>
            <module name="javax.el.api" export="true"/>
            <module name="javax.enterprise.api" export="true"/>
            <module name="javax.enterprise.deploy.api" export="true"/>
            <module name="javax.inject.api" export="true"/>
            <module name="javax.interceptor.api" export="true"/>
            <module name="javax.jms.api" export="true"/>
            <module name="javax.jws.api" export="true"/>
            <module name="javax.mail.api" export="true"/>
            <module name="javax.management.j2ee.api" export="true"/>
            <!-- <module name="javax.persistence.api" export="true"/> -->
            <module name="javax.resource.api" export="true"/>
            <module name="javax.rmi.api" export="true"/>
            <module name="javax.security.auth.message.api" export="true"/>
            <module name="javax.security.jacc.api" export="true"/>
            <module name="javax.servlet.api" export="true"/>
            <module name="javax.servlet.jsp.api" export="true"/>
            <module name="javax.transaction.api" export="true"/>
            <module name="javax.validation.api" export="true"/>
            <module name="javax.ws.rs.api" export="true"  services="export"/>
            <module name="javax.xml.bind.api" export="true"/>
            <module name="javax.xml.registry.api" export="true"/>
            <module name="javax.xml.soap.api" export="true"/>
            <module name="javax.xml.ws.api" export="true"/>

            <!-- This one always goes last. -->
            <module name="javax.api" export="true"/>
            <!-- --------------------- -->
        </dependencies>
    </deployment>
</jboss-deployment-structure>

this is fully portable

这篇关于在EAP 6.4.0中使用JPA 2.1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆