在EAP 6.4.0中使用JPA 2.1

在EAP 6.4.0中使用JPA 2.1,jpa,jboss,classpath,classloader,Jpa,Jboss,Classpath,Classloader,到目前为止,我一直在寻找解决这个问题的办法,但没有成功 我们正在将应用程序迁移到EAP 6.4.0,我们的应用程序依赖于JPA 2.1。然而,JBoss是一个JavaEE6服务器,因此包含模块形式的JPA2.0 我尝试将JPAAPIJAR直接包含在我的WEB-INF/lib目录中,认为类加载器更喜欢这个而不是系统中的那个 我已经尝试在ear中包含jboss-deployment-structure.xml文件。我在ear/META-INF、ear/war/META-INF和ear/war/WEB

到目前为止,我一直在寻找解决这个问题的办法,但没有成功

我们正在将应用程序迁移到EAP 6.4.0,我们的应用程序依赖于JPA 2.1。然而,JBoss是一个JavaEE6服务器,因此包含模块形式的JPA2.0

我尝试将JPAAPIJAR直接包含在我的WEB-INF/lib目录中,认为类加载器更喜欢这个而不是系统中的那个

我已经尝试在ear中包含jboss-deployment-structure.xml文件。我在ear/META-INF、ear/war/META-INF和ear/war/WEB-INF下进行了尝试

在jboss-deployment-structure.xml文件中,我尝试: 排除javax.persistence.api模块 使用JPA2.1创建我自己的模块,并向其添加依赖项 排除jpa子系统

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

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

所有这些都导致了JPA2.0JAR的使用

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

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

请查看:

这是上面链接的副本:

解决方案1

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

<!--<module name="javax.persistence.api" export="true"/>-->
<?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>

虽然这是不可移植的

解决方案2

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

<!--<module name="javax.persistence.api" export="true"/>-->
<?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>


这是完全可移植的

我收到了这个错误[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]:调用init方法失败;嵌套的异常是java.lang.NoSuchMethodError:org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V