Maven:hibernate entitymanager与javaee api一起打破了我的单元测试

Maven:hibernate entitymanager与javaee api一起打破了我的单元测试,java,jakarta-ee,build,maven,Java,Jakarta Ee,Build,Maven,我的pom中有两个依赖项javaee api和hibernate entitymanager。但它们不能很好地协同工作:只要我添加JavaEEAPI,我的所有单元测试都会中断,因为java.lang.ClassFormatError:在类文件javax/validation/validation中,方法中缺少非本机或抽象的代码属性。没有JavaEEAPI,一切都可以正常工作。为什么呢 (为了适应这个问题,对这个问题进行了编辑;)Maven依赖项没有顺序,但提供了 因此,您需要做的是,使用作用域为

我的pom中有两个依赖项
javaee api
hibernate entitymanager
。但它们不能很好地协同工作:只要我添加JavaEEAPI,我的所有单元测试都会中断,因为
java.lang.ClassFormatError:在类文件javax/validation/validation
中,方法中缺少非本机或抽象的代码属性。没有JavaEEAPI,一切都可以正常工作。为什么呢

(为了适应这个问题,对这个问题进行了编辑;)

Maven依赖项没有顺序,但提供了

因此,您需要做的是,使用作用域为以下对象构建正确的依赖项集:

  • 编译时
  • 服务器中的运行时:(例如,
    provided
    用于compiletime需要但将由服务器提供的依赖项,因此您的应用程序不包含它们
  • 测试时间:使用
    test
    范围添加仅用于测试的依赖项(例如junit)
在您的特殊情况下,javax.validation接口库在测试中似乎不可用。可能它们未包含在
javaee api
中。如果是这种情况,请添加:

     <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version>
        <scope>test</scope>
    </dependency>

javax.validation
)


首先,

据我所知,在Maven2中,依赖项的顺序没有保留,并且在执行代码时,这些依赖项在最终类路径中的出现顺序也没有保证。在您的情况下,我将“排除”依赖关系结构中的重叠库

寻找Maven排除文档

考虑到库版本匹配的复杂性,我建议您从一个HibernateMaven开始,并将其变形到您的项目中


我希望这会有所帮助。

这是由java-ee-api.jar包含的内容造成的。有很多方法可以解决这个问题。更改pom.xml中的顺序也帮了我的忙。

您使用的是什么应用服务器,Jboss,Glassfish?单元测试时不涉及应用服务器,但该应用程序稍后将在Jboss 6中运行。我确定Jboss提供了什么,没有提供什么。而且范围是正确的。但是当JavaEEAPI在类路径中时,HibernateEntityManager可能会在运行时加载一些验证内容;这可以解释这种奇怪的行为。提前谢谢,我明天会检查的。我添加了依赖验证api,关闭了bean验证,现在一切正常-你是对的!我在依赖项的底部列表中添加了依赖项,但不起作用。但向高层迈进是可行的。非常奇怪。依赖顺序确实很重要。