为什么我需要添加神器JSR305才能使用Guava 14+?

时间:2014-06-17 12:20:57

标签: java maven guava jsr305

在查找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中?这看起来更像是一种解决方法,而不是解决方案,我更愿意理解并使事情变得清洁。

感谢您的参与。

1 个答案:

答案 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最佳实践),但这种变化使得这应该成为必须。