7

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

我需要将我的 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 存储库所报告的那样。

我觉得奇怪的是guava 14也依赖于JSR305作为mvn 存储库报告。

如果我将 JSR 依赖项添加到我的 pom 中,则编译运行良好:

<dependency>
    <groupId>com.google.code.findbugs</groupId>
    <artifactId>jsr305</artifactId>
    <version>1.3.9</version>
    <scope>provided</scope>
</dependency>

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

感谢您的参与。

4

1 回答 1

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网站上,他们就provided依赖项声明了以下内容:

provided这很像compile,但表示您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java 企业版构建 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 最佳实践),但是这种更改使得这应该成为必须。

于 2014-06-17T12:51:10.140 回答