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

Rém*_*ghe 6 java jsr305 maven guava

在查找stackoverflow的信息时,我看到了一个类似于我的问题,但这里没有真正的答案.

我需要将我的maven项目从番石榴11.0.2迁移到番石榴14或更高版本(我需要RangeSet).我用依赖更新了我的maven pom:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>14.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后我运行maven构建,并得到此错误:

[ERROR] xxx.java: cannot find symbol
[ERROR] symbol  : class Nonnull
[ERROR] location: package javax.annotation
Run Code Online (Sandbox Code Playgroud)

我仔细看了一下,这个注释是用JSR305提供的,其上依赖于guava 11.0.2,因为mvn存储库会报告它.

我觉得奇怪的是,番石榴14还依赖于JSR305作为mvn存储库报告.

如果我将JSR依赖项添加到我的pom,那么编译运行正常:

<dependency>
    <groupId>com.google.code.findbugs</groupId>
    <artifactId>jsr305</artifactId>
    <version>1.3.9</version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但是,如果guava已经依赖它,为什么我必须将此依赖项添加到我的pom中?这看起来更像是一种解决方法,而不是解决方案,我更愿意理解并使事情变得清晰.

感谢您的参与.

DB5*_*DB5 13

您需要将其添加为依赖项的原因是因为Guava 14在其pom中定义了依赖关系,如下所示:

<dependency>
    <groupId>com.google.code.findbugs</groupId>
    <artifactId>jsr305</artifactId>
    <version>1.3.9</version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

你的问题的重要部分是<scope>provided</scope>线.

从maven 网站,他们在provided依赖关系方面声明如下:

提供: 这很像compile,但表示您希望JDK或容器在运行时提供依赖关系.例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为范围,provided因为Web容器提供了这些类.此范围仅在编译和测试类路径中可用,并且不可传递.

所以基本上是因为Guava已经将它设置为provided依赖关系,他们希望消费Guava的人能够提供这种依赖,这正是你必须要做的.

在Guava 11.0.2中,它是一个正常的compile依赖,因此您不必在自己的项目中提供它.

更改是在Guava 13中进行的.从发布说明:

使用findbugs 2.0时,为findbugs提供了依赖以避免dep冲突.这种变化的副作用是,依赖于Guava授予"免费"访问JSR-305注释的项目将会中断,除非它们提供自己直接依赖于该jar(或等效的).项目应始终直接取决于JSR-305(每个maven最佳实践),但这种变化使得这应该成为必须.

  • 是的,不是.您可以自己尝试 - 只使用Guava创建一个干净的项目,而不使用JSR-305.一切都可以在Java中正常工作(至少在Java 7中,不确定Java 8).那是因为您在运行时不需要注释类.例如,参见http://stackoverflow.com/questions/3567413/why-doesnt-a-missing-annotation-cause-a-classnotfoundexception-at-runtime.但是,使用Scala,这是一首不同的歌曲,你是对的. (2认同)