我的pom中有两个依赖项javaee-api
和hibernate-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,一切正常。那是为什么?
(此问题已经过编辑以适应问题;))
答案 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)