Exclude JPA 2.0 from JBoss 7.1 in order to use hib

2019-02-03 02:24发布

问题:

I want to use hibernate 4.3 for its multitenancy features in JBoss 7.1.

I managed to include it in my war by adding the following lines in jboss-deployment-structure

<exclusions>
   <module name="org.hibernate" />
</exclusions>

and adding a dependency to hibernate core and entity manager in my pom.xml

This made hibernate 4.3 to load but unfortunately I got an error

java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;

which is due to JPA 2.0 being loaded when hibernate 4.3 is using JPA 2.1

I have seen these threads and tried what they suggest Excluding JPA Subsystem from JBoss EAP 6.1 - Trying to use JPA 2.1 in JBoss EAP 6.1, JBoss AS7 Automatically Loading JPA, Hibernate 4.3.0.Final & Spring Data JPA 1.4.3.RELEASE.

I added a persistence.xml with

<property name="jboss.as.jpa.managed" value="false" /> 

excluded hibernate jpa 2.0 from Spring Data

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>${spring-data.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Removed JPA subsystem completely from JBoss standalone.xml, without any success.

The only thing that did the trick was to exclude the whole javaee.api in jboss-deployment-structure, as suggested in another thread

<exclusions>
    <module name="javax.persistence.api"/>
    <module name="javaee.api"/>
</exclusions>

but this causes many problems to the rest of my code.

UPDATE: my jboss-deployment-structure.xml is now like this

<jboss-deployment-structure>
<deployment>
    <exclusions>
        <module name="org.slf4j" />
        <module name="org.slf4j.impl" />
        <module name="org.apache.log4j" />
        <module name="javax.persistence.api" />
        <module name="org.hibernate" />
    </exclusions>
    <dependencies>
        <module name="org.jboss.ironjacamar.jdbcadapters" />
        <module name="org.hornetq" />
        <module name="org.hornetq.ra" />
        <module name="org.jboss.ejb3" />
        <module name="org.jboss.ejb-client" />
    </dependencies>
</deployment>
</jboss-deployment-structure>

As you see I have tried many things without luck, so if anyone has another idea it is most welcome.

回答1:

I would split this problem into two smaller:

1) Make sure you're not transitively depending on JPA 2.0

For this you can use dependency graph visualization tool (NetBeans have one built in, or you can use a maven dependency tree plugin). Another way would be just to skim through the libs, included in your artifact before deploying to JBoss.

2) Ensure correct configuration of JBoss AS 7.1

JBoss AS 7.1 is bundled with Hibernate 4.0.x jars, in order to update them try out this steps as described in the official doc.

  • update the current as7/modules/org/hibernate/main folder to contain the newer version

  • Delete *.index files in as7/modules/org/hibernate/main and as7/modules/org/hibernate/envers/main folders

  • Backup the current contents of as7/modules/org/hibernate in case you make a mistake

  • Remove the older jars and copy new Hibernate jars into as7/modules/org/hibernate/main + as7/modules/org/hibernate/envers/main

  • Update the as7/modules/org/hibernate/main/module.xml + as7/modules/org/hibernate/envers/main/module.xml to name the jars that you copied in

Updated as7/modules/org/hibernate/main/module.xml will look like (note that dependencies won't change):

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="org.hibernate">
    <resources>
        <resource-root path="hibernate-core-4.3.5.Final.jar"/>
        <resource-root path="hibernate-commons-annotations-4.0.4.Final.jar"/>
        <resource-root path="hibernate-entitymanager-4.3.5.Final.jar"/>
        <resource-root path="hibernate-infinispan-4.3.5.Final.jar"/>
    </resources>

    <dependencies>
       .
       .
    </dependencies>
</module>


回答2:

Try removing only the javax.persistence.api module along with org.hibernate.

Also, if you want to switch to Hibernate 4.3 for all web applications (which should be backward compatible), switch to a newer version of Hibernate as described here.

Some debugging tips: after generating your JAR files, check explicitly what JPA/Hibernate libraries they contain (by unzipping them). Also in order to check the Hibernate Version you could do it like it is here described.

Also check the structure of the jboss-deployment-structure file, as it seems that the <exclusions> element is neither in a <deployment>, nor in an <sub-deployment> element.



回答3:

for us the following helped (works only for non-container-managed JPA scenarios!):

  1. IDE-side: (Eclipse Kepler) removing (added during tests and forgot to remove) the (locally installed) JBoss 7.1.1.Final Library project Build Path dependency

  2. Maven-side: (mvn 3.0.4 and 3.3.3) outcommented the following hibernate JPA 2.0 including section in our global /pom.xml (its an ear project with /pom.xml, ear/pom.xml, ejb/pom.xml and web/pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
        ...
    
        <dependencyManagement>
            <dependencies>
                ...
    
                <!-- outcommented because of JPA 2.1 support -->
                <!-- 
                <dependency>
                    <groupId>org.jboss.bom</groupId>
                    <artifactId>jboss-javaee-6.0-with-hibernate</artifactId>
                    <version>${version.jboss.bom}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                -->
            </dependencies>
        </dependencyManagement>
    
        ...
    
  3. Maven-side: adding only hibernate-entitymanager 4.3.8.Final and our db driver (postgres) as DB/ORM-related dependencies (which load all other required libs as well) in our /ejb/pom.xml

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.3-1102-jdbc41</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.8.Final</version>
    </dependency>
    
  4. server-side: disabling JPA 2.0 in our JBoss 7.1.1.Final globally (for all webapps/libs, if you have multiple) setting <module name="javax.persistence.api" export="false"/>

    • in jboss-as/modules/javaee/api/main/module.xml as suggested here: https://issues.jboss.org/browse/WFCORE-209?_sscc=t

hints:

  • the (also tried) /ear/src/main/application/META-INF/jboss-deployment-structure.xml portable solution cannot work with JBoss 7.1.1.Final since the <exclude-subsystem> feature was added in JBoss 7.1.2 later, see
    • suggestion to do this: https://issues.jboss.org/browse/WFCORE-209?_sscc=t
    • Workaround 2 will cause XML Parse/Namespace Exceptions:
      • https://developer.jboss.org/message/784133?_sscc=t#784133
      • https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7?focusedCommentId=53379592&_sscc=t#comment-53379592
      • Jboss AS7 - jboss-deployment-structure.xml deployment error
      • https://access.redhat.com/solutions/258543
      • https://bugzilla.redhat.com/show_bug.cgi?id=953328


回答4:

try using a lower version of the hibernate-entitymanager

 <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.6.0.Final</version>
</dependency>

and jpa 2.0 may work > It worked for me.