为什么"提供"范围的依赖关系会隐藏Maven中的传递依赖?

Han*_*etz 12 java maven-2

我的Maven项目中有三个模块(稍微简化):

  • model包含JPA带注释的实体类
  • 持久化实例化EntityManager并在其上调用方法
  • 应用程序模型中创建类的实例,设置一些值并将它们传递给持久性

模型持久性显然取决于javax.persistence,但我认为应用不应该.

javax.persistence依赖移动到顶层POM的dependencyManagement,因为它在多个子模块,其中我只引用条目出现部分.

让我感到惊讶的是,我必须在application设置范围时引用依赖关系provided,而我的范围是什么时候不必compile.

随着一个范围provided,如果我没有在清单中dependencies应用,构建失败,从javac的错误消息:

com.sun.tools.javac.code.Symbol $ CompletionFailure:找不到javax.persistence.InheritanceType的类文件

这是怎么回事?

Pas*_*ent 12

模型和持久性显然取决于javax.persistence,但我认为应用程序不应该.

确实如此.但是传递依赖分辨率无关,与你的问题(实际上,javax.persistenceprovidedmodelpersistenceapplication取决于与compile范围,从而在记录它被省略3.4.4传递依赖).

在我看来,你是这个bug的受害者:http://bugs.sun.com/view_bug.do?video_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 bug的一种解决方法,application不应该需要那个依赖来编译.