Hibernate ClassCastException org.dom4j.DocumentFactory用于Wildfly Swarm&;阿奎利安

Hibernate ClassCastException org.dom4j.DocumentFactory用于Wildfly Swarm&;阿奎利安,hibernate,junit,jboss-arquillian,wildfly-swarm,Hibernate,Junit,Jboss Arquillian,Wildfly Swarm,我在Wildfly Swarm中使用Arquillian运行EJB测试时遇到了一个问题,它与Hibernate和以下问题有关: 错误: ERROR[stderr](main)由以下原因引起:java.lang.ClassCastException:org.dom4j.DocumentFactory无法强制转换为org.dom4j.DocumentFactory“,“WFLYCTL0412:未安装的必需服务:”=>[“jboss.persistenceunit.\”adaee1b1-6c6b-4f

我在Wildfly Swarm中使用Arquillian运行EJB测试时遇到了一个问题,它与Hibernate和以下问题有关:

错误:

ERROR[stderr](main)由以下原因引起:java.lang.ClassCastException:org.dom4j.DocumentFactory无法强制转换为org.dom4j.DocumentFactory“,“WFLYCTL0412:未安装的必需服务:”=>[“jboss.persistenceunit.\”adaee1b1-6c6b-4f9b-834a-ea36333986b8.jar\35; AP\”,“WFLYCTL0180:缺少/依赖项的服务”“=>未定义}
org.wildfly.swarm.container.runtime.RuntimeDeployer.deploy(RuntimeDeployer.java:273)处出现错误[stderr](main)

我正在使用Hibernate和JPA,并在运行Wildfly Swarm时通过将提供的
设置为所有Hibernate依赖项解决了这个问题。但是,在Arquillian中运行测试时,这不起作用

ServiceTest.java

@RunWith(Arquillian.class)
public class ServiceTest {
    @EJB
    private TestService testService;

    @Deployment
    public static Archive<?> createDeployment() throws Exception {
        return new ArchiveBuilder().buildArchive();
    }

    @Test
    public void testService() {
        testService.test();
    }
}
public class ArchiveBuilder {
    public Archive<?> buildArchive() throws Exception {
        final JARArchive ejbArchive = ShrinkWrap.create(JARArchive.class);
        ejbArchive.addClass(AdapterService.class);

        final List<JavaArchive> artifacts = ArtifactLookup.get().allArtifacts(new String[]{"org.wildfly.swarm"});

        for (final JavaArchive javaArchive : artifacts) {
            ejbArchive.merge(javaArchive);
        }

        return ejbArchive;
    }
}
@RunWith(Arquillian.class)
公共类服务测试{
@EJB
私有测试服务测试服务;
@部署
公共静态存档createDeployment()引发异常{
返回新的ArchiveBuilder().buildArchive();
}
@试验
公共void测试服务(){
testService.test();
}
}
ArchiveBuilder.java

@RunWith(Arquillian.class)
public class ServiceTest {
    @EJB
    private TestService testService;

    @Deployment
    public static Archive<?> createDeployment() throws Exception {
        return new ArchiveBuilder().buildArchive();
    }

    @Test
    public void testService() {
        testService.test();
    }
}
public class ArchiveBuilder {
    public Archive<?> buildArchive() throws Exception {
        final JARArchive ejbArchive = ShrinkWrap.create(JARArchive.class);
        ejbArchive.addClass(AdapterService.class);

        final List<JavaArchive> artifacts = ArtifactLookup.get().allArtifacts(new String[]{"org.wildfly.swarm"});

        for (final JavaArchive javaArchive : artifacts) {
            ejbArchive.merge(javaArchive);
        }

        return ejbArchive;
    }
}
公共类ArchiveBuilder{
公共存档buildArchive()引发异常{
final JARArchive ejbArchive=ShrinkWrap.create(JARArchive.class);
addClass(AdapterService.class);
最终列表工件=ArtifactLookup.get().allArtifacts(新字符串[]{“org.wildfly.swarm”});
用于(最终JavaArchive JavaArchive:artifacts){
合并(javaArchive);
}
还田韭菜;
}
}
ArchiveBuilder摘自以下帖子:

pom.xml依赖关系

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.wildfly.swarm</groupId>
    <artifactId>cdi</artifactId>
    <version>2017.5.0</version>
</dependency>

<dependency>
    <groupId>org.wildfly.swarm</groupId>
    <artifactId>ejb</artifactId>
    <version>2017.5.0</version>
</dependency>

<dependency>
    <groupId>org.wildfly.swarm</groupId>
    <artifactId>jpa</artifactId>
    <version>2017.5.0</version>
</dependency>

<dependency>
    <groupId>org.wildfly.swarm</groupId>
    <artifactId>jaxrs</artifactId>
    <version>2017.5.0</version>
</dependency>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.195</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.2.Final</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.2.10.Final</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.2.10.Final</version>
    <scope>provided</scope>
</dependency>

爪哇
JavaEEAPI
7
假如
org.wildfly.swarm
cdi
2017.5.0
org.wildfly.swarm
ejb
2017.5.0
org.wildfly.swarm
jpa
2017.5.0
org.wildfly.swarm
jaxrs
2017.5.0
com.h2数据库
氢
1.4.195
org.hibernate
休眠验证器
5.2.2.最终版本
假如
org.hibernate
休眠实体管理器
5.2.10.最终版本
假如
org.hibernate
hibernate-c3p0
5.2.10.最终版本
假如
如果修改Hibernate依赖项以删除dom4j.dom4j:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.2.10.Final</version>
    <scope>provided</scope>
    <exclusions>
        <exclusion>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

org.hibernate
休眠实体管理器
5.2.10.最终版本
假如
dom4j
dom4j
我得到的是:

org.wildfly.swarm.container.DeploymentException导致的错误[stderr](main):WFSWARM0004:部署失败:{“WFLYCTL0080:failed services”=>{“jboss.persistenceunit.\“7d32cda0-83d2-47d3-8066-ae1f56899801.jar#AP\”=>“org.jboss.msc.service.StartException服务jboss.persistenceunit.\”7d32cda0-83d2-47d3-8066-ae1f56899801.jar#AP\“:javax.persistence.PersistenceException:[PersistenceUnit:AP]无法构建Hibernate SessionFactory
错误[stderr](main)由以下原因引起:javax.persistence.PersistenceException:[PersistenceUnit:AP]无法生成Hibernate SessionFactory
错误[stderr](main)由以下原因引起:org.hibernate.MappingException:无法获取org.hibernate.persister.entity.SingleTableEntityPersister的构造函数
错误[stderr](main)由以下原因引起:org.hibernate.hibernateeexception:无法实例化默认tuplizer[org.hibernate.tuple.entity.PojoEntityTuplizer]
错误[stderr](主)由以下原因引起:java.lang.reflect.InvocationTargetException
错误[stderr](main)由以下原因引起:java.lang.RuntimeException:by java.lang.NoClassDefFoundError:org/hibernate/proxy/HibernateProxy
错误[stderr](main)由以下原因引起:javassist.CannotCompileException:by java.lang.NoClassDefFoundError:org/hibernate/proxy/HibernateProxy
错误[stderr](main)由以下原因引起:java.lang.NoClassDefFoundError:org/hibernate/proxy/HibernateProxy

错误[stderr](main)是由以下原因引起的:java.lang.ClassNotFoundException:org.hibernate.proxy.HibernateProxy来自[模块\“org.picketbox:main\”来自BootModuleLoader@22555ebf对于查找程序[BootstrapClasspathModuleFinder,BootstrapModuleFinder(org.wildfly.swarm.bootstrap:main),ClasspathModuleFinder,ContainerModuleFinder(swarm.container:main),ApplicationModuleFinder(swarm.application:main),org.wildfly.swarm.bootstrap.modules。DynamicModuleFinder@36ebc363]]“},”WFLYCTL0412:未安装的必需服务:“=>[“jboss.persistenceunit.\”7d32cda0-83d2-47d3-8066-ae1f56899801.jar#AP\”],“WFLYCTL0180:缺少/不可用依赖项的服务”=>未定义}

由于
jpa
依赖关系,Hibernate类应该位于编译类路径上,因此您不需要自己添加它们。如果没有,那么我们可能需要解决一些问题。你能提出一个问题吗:这似乎是因为它是一个多模块的Maven项目,我把它重构成一个标准的war项目,它可以工作。我将创建一个可复制的项目并提出一个问题。由于
jpa
依赖关系,Hibernate类应该位于编译类路径上,因此您不需要自己添加它们。如果没有,那么我们可能需要解决一些问题。你能提出一个问题吗:这似乎是因为它是一个多模块的Maven项目,我把它重构成一个标准的war项目,它可以工作。我将创建一个可复制的项目并提出一个问题。