Maven:hibernate-entitymanager和javaee-api一起打破我的unit testing

我在我的pom中有两个依赖项javaee-apihibernate-entitymanager 。 但是它们不能很好地协同工作:一旦我添加了javaee-api,我的所有unit testing都会因java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation而失败java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation 。 没有javaee-api,一切正常。 这是为什么?

(这个问题已经过编辑以适应问题;))

Maven依赖关系没有顺序 ,但提供了范围的概念。

所以你需要做的是,使用范围来构建正确的依赖关系:

  • 编译时间
  • 服务器中的运行时:(例如provided用于在编译时需要的依赖项,但将由服务器提供,因此您的应用程序必须/不能包含它们
  • 测试时间:使用test范围添加仅用于测试的依赖项(例如junit)

在您的特殊情况下,看起来javax.validation接口库在测试中是不可用的。 可能他们没有在javaee-api 。 如果是这种情况,那么添加:

   javax.validation validation-api 1.0.0.GA test  

但要小心 ,你的解释,关于服务器中包含的内容,以及描述的行为听起来很奇怪。 – 我建议仔细检查服务器提供的内容以及javaee-api中继包含的内容。 但是我可能错了,只有test explicit才需要javax.validation

当包含javaee-api时,问题只会出现的原因可能是,当类路径中的实现可用时,javaxvalidation有时只会打开。


在某些情况下,依赖的顺序很重要。 “问题”是,如果在两个地方(直接和非直接)引用了一个libary / dependency,并且两个引用的版本对同一个库不同,则Maven必须决定使用哪个版本。

第一个也是最重要的标准是依赖树中引用的深度。 如果您直接在项目POM中引用库,那么这将主导所有其他。 如果库是由您直接引用的库直接引用的,那么这将主导所有其他更多间接的库。

但是如果在依赖树的相同深度中有两个引用(对于不同版本中的相同库),则第一个将获胜。 ( 更多细节 )。

首先,

这是因为java-ee-api.jar包含残缺的类 。 还有其他依赖关系来解决这个问题。 改变pom.xml中的顺序也对我有用。

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

在这里查看Maven排除文档。

鉴于库版本匹配的复杂性,我建议您从一个Hibernate Maven 示例开始 ,并将其转换为您的项目。

我希望这有帮助。