【问题标题】:Maven: hibernate-entitymanager together with javaee-api break my unit testsMaven:hibernate-entitymanager 和 javaee-api 一起破坏了我的单元测试
【发布时间】:2011-08-04 01:17:31
【问题描述】:

我的 pom.xml 中有两个依赖项 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,一切正常。这是为什么呢?

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

【问题讨论】:

  • 你用的是什么应用服务器,Jboss,Glassfish?
  • 单元测试时不涉及应用服务器,但该应用稍后会在JBoss 6中运行。

标签: java jakarta-ee build maven


【解决方案1】:

Maven 依赖没有顺序,但是提供了scopes的概念。

所以你需要做的是,使用作用域来构建正确的依赖集:

  • 编译时间
  • 服务器中的运行时:(例如,使用provided 表示在编译时需要但将由服务器提供的依赖项,因此您的应用程序确实/不得包含它们
  • 测试时间:使用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>

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

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


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

第一个也是最重要的标准是依赖关系树中引用的深度。如果您直接在项目 POM 中引用该库,那么这将支配所有其他。如果该库由您直接引用的库直接引用,那么这将支配所有其他的地方。

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

首先,

【讨论】:

  • 我确定 jboss 提供了什么,什么不是。范围也是正确的。但是当 javaee-api 在类路径中时,hibernate-entitymanager 可能会在运行时加载一些验证内容;这可以解释奇怪的行为。提前谢谢,我明天会检查。
  • 我添加了依赖验证-api 关闭了 bean 验证,现在一切正常 - 你是对的!
  • 我在依赖项的底部列表中添加了依赖项,但不起作用。但为顶级作品而努力。很奇怪。
  • 依赖顺序绝对重要。
【解决方案2】:

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

查看 here 获取 Maven 排除文档。

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

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    这是由于 java-ee-api.jar 包含 crippled classes 造成的。有alternative dependencies 可以解决这个问题。更改 pom.xml 中的顺序也对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2014-05-08
      • 2022-01-03
      • 2015-02-27
      • 2018-09-12
      • 2017-09-10
      相关资源
      最近更新 更多