【问题标题】:Why do I need adding artifact JSR305 to use Guava 14+?为什么我需要添加工件 JSR305 才能使用 Guava 14+?
【发布时间】:2014-06-17 12:20:56
【问题描述】:

在寻找有关 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 所报告的那样。

我觉得奇怪的是,guava 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>

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

感谢参与。

【问题讨论】:

  • 我似乎记得在使用 Scala 编译器时这是必要的——这是你的设置吗?
  • 这不是我的设置,因为我构建了一个 java 项目。但这个问题和我的很接近……

标签: java maven guava jsr305


【解决方案1】:

之所以需要将其添加为依赖项是因为 Guava 14 在其 pom 中定义了如下依赖项:

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

您的问题的重要部分是&lt;scope&gt;provided&lt;/scope&gt; 行。

来自 maven website,他们针对 provided 依赖项声明了以下内容:

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

【讨论】:

  • 是和不是。您可以自己尝试一下 - 仅使用 Guava 而不使用 JSR-305 创建一个干净的项目。在 Java 中一切都可以正常工作(至少在 Java 7 中,不确定 Java 8)。那是因为您在运行时不需要注释类。参见例如stackoverflow.com/questions/3567413/…。但是,对于 Scala,这是一首不同的歌曲,您是对的。
  • 就我而言,我在运行时需要它,所以 DB5 答案适合我。
  • Guava 本身的一切都应该在运行时没有 JSR-305 jar 的情况下正常工作。如果您在自己的代码中使用 JSR-305 注释,那么是的,您现在需要直接依赖它来编译。 (除非您出于某种原因对注释进行反射,否则您在运行时仍然不需要它。)
  • 所以我对与运行时保留相关的整个交易感到困惑。如果我在我的应用程序中包含 Guava 作为依赖项,但我不包含 jsr305 作为依赖项,如果我对我的代码使用反射,我是否会面临引发异常的风险,因为方法表明它使用 @例如 987654332@ 注释,但 jsr305 未包含在二进制文件中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2012-08-08
相关资源
最近更新 更多