在查找stackoverflow的信息时,我看到了一个类似于我的问题,但没有真正的答案here。
我需要将我的maven项目从 guava 11.0.2 迁移到 guava 14 或更高(我需要RangeSet)。我用依赖项更新了我的maven pom:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0</version>
</dependency>
然后我运行maven构建,并收到此错误:
[ERROR] xxx.java: cannot find symbol
[ERROR] symbol : class Nonnull
[ERROR] location: package javax.annotation
我仔细观察了一下这个注释是由 JSR305 提供的,依赖于 guava 11.0.2 ,因为mvn repository会报告它。
我觉得奇怪的是番石榴14 还依赖于 JSR305 作为mvn repository报告。
如果我将JSR依赖项添加到我的pom中,那么编译运行正常:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
<scope>provided</scope>
</dependency>
但是,如果guava已经依赖它,为什么我必须将此依赖项添加到我的pom中?这看起来更像是一种解决方法,而不是解决方案,我更愿意理解并使事情变得清洁。
感谢您的参与。
答案 0 :(得分:13)
您需要将其添加为依赖项的原因是因为Guava 14在其pom中定义了依赖关系,如下所示:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
<scope>provided</scope>
</dependency>
问题的重要部分是<scope>provided</scope>
行。
来自maven website,他们就provided
依赖关系声明了以下内容:
的提供强> 的: 这与
compile
非常相似,但表示您希望JDK或容器在运行时提供依赖关系。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为范围provided
,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。
所以基本上是因为Guava已将此设置为provided
依赖关系,他们希望任何使用Guava的人提供此依赖关系,这正是您必须要做的事情。
在Guava 11.0.2中,它是一个正常的compile
依赖项,因此您无需在自己的项目中提供它。
改变是在Guava 13.来自release notes:
使用findbugs 2.0时,为findbugs提供了依赖,以避免dep冲突。这种变化的副作用是,依赖于Guava授予“免费”访问JSR-305注释的项目将会中断,除非它们提供自己直接依赖于该jar(或等效的)。项目应始终直接取决于JSR-305(每个maven最佳实践),但这种变化使得这应该成为必须。