我的Maven项目中有三个模块(稍微简化):
模型和持久性显然取决于javax.persistence
,但我认为应用程序不应该。
javax.persistence
依赖项被移动到顶级POM的dependencyManagement
部分,因为它出现在许多子模块中,我只引用该条目。
令我感到惊讶的是,当我将其范围设置为application
时,我必须在provided
中引用依赖关系,而我的范围是compile
时则不必。
范围为provided
,如果我没有在应用程序的dependencies
中列出,则构建将失败并显示来自javac的错误消息:
com.sun.tools.javac.code.Symbol $ CompletionFailure:找不到javax.persistence.InheritanceType的类文件
发生了什么事?
答案 0 :(得分:12)
模型和持久性显然取决于javax.persistence,但我认为应用程序不应该。
这是真的。但是,传递依赖性解决方案与您的问题无关(实际上,javax.persistence
是provided
到model
和persistence
application
取决于compile
1}}范围所以它被省略,如3.4.4. Transitive Dependencies)中所述。
在我看来,你是这个错误的受害者:http://bugs.sun.com/view_bug.do?bug_id=6550655
我对EJB3有同样的问题 使用继承注释的实体:
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
使用此实体的客户端类不会 在ejb3 annatations时编译 不在类路径上,但崩溃了 以下消息:
com.sun.tools.javac.code.Symbol$CompletionFailure: class file for javax.persistence.InheritanceType not found
[...]
请注意,这是bug 6365854的特例(据报道已修复);这里的问题似乎是注释使用枚举作为其值。
当前的解决方法是将缺少的枚举添加到CLASSPATH。
在您的情况下,“更糟糕”的方法是将javax.persistence
作为provided
依赖项添加到application
模块。但这是JVM错误的解决方法,application
不需要编译依赖项。
答案 1 :(得分:2)
答案 2 :(得分:1)
dependencyManagement
部分声明了如果使用它们的依赖关系,而不是将使用它们。因此,您仍需要声明一个最小依赖项声明,以便在子项目中应用该配置。有关详细信息,请参阅Maven书籍的dependency management section。
所需的最低要求通常是groupId和artifactId。
如果要继承配置而不声明配置,则应在父dependencies
部分中定义,而不是dependencyManagement