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

时间:2011-04-12 16:22:11

标签: java java-ee build maven

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

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

3 个答案:

答案 0 :(得分:5)

Maven依赖关系没有命令,但是提供了scopes的概念。

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

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

在您的特殊情况下,看起来javax.validation接口libary在测试中是不可用的。愿它们不在javaee-api中。如果是这种情况,请添加:

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

但要小心,您的解释,关于服务器中包含的内容以及所描述的行为对我来说听起来很奇怪。 - 我建议仔细检查服务器提供的内容以及javaee-api中继包含的内容。但是我可能错了,javax.validation仅用于测试显式

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


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

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

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

首先,

答案 1 :(得分:4)

这是因为java-ee-api.jar包含crippled classes。周围有alternative dependencies解决了这个问题。改变pom.xml中的顺序也对我有用。

答案 2 :(得分:0)

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

查看here了解Maven排除文档。

鉴于库版本匹配的复杂性,我建议您从Hibernate Maven examples开始,然后将其转换为您的项目。

我希望这会有所帮助。