【问题标题】:Why do I need jsr305 to use guava in scala?为什么我需要 jsr305 才能在 scala 中使用番石榴?
【发布时间】:2014-01-01 19:32:46
【问题描述】:

我有以下 scala 文件:

object SGuavaTryout {
  com.google.common.cache.CacheBuilder.newBuilder()
}

我在类路径中使用 guava-11.0.2.jar 进行编译。我的 scala 2.9.1 编译器(eclipse 插件和普通 scalac)抱怨:

error while loading CacheBuilder, Missing dependency 
  'class javax.annotation.CheckReturnValue', required by 
  D:\devel\eclipse-workspace\Scala Spielwiese\guava-11.0.2.jar
  (com/google/common/cache/CacheBuilder.class)

要编译,我需要将 jsr305 (jsr305-1.3.9.jar) 添加到构建路径中。没有 jsr305 的 java 等效编译就好了:

public class JGuavaTryout {
  public void tryout() {
    com.google.common.cache.CacheBuilder.newBuilder();
  }
}

任何想法为什么 scala 需要 jsr305?是否有官方的 jsr305 实现与 guava 一起使用?

谢谢! - 乔治

【问题讨论】:

    标签: scala guava


    【解决方案1】:

    这是因为 Scala 编译器的设计方式,它要求类公开的所有类型在编译时都可用,而 Java 编译器实际上并不关心。

    【讨论】:

    • Java 编译器特别不关心注解类型,但我认为所有其他类型都需要可用。
    • Scala 2.11.1 及更高版本现在可以优雅地处理丢失的注释;你不再需要类路径上的 jsr305。
    【解决方案2】:

    Sean Parsons 通过解释为什么 Scala 需要 JSR 305 依赖项回答了您的第一个问题。

    至于与 Guava 一起使用的“官方”JSR 305 实现,我会使用他们在 pom.xml 中声明的那个:

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

    如果您使用的是 Maven,我认为它会自动将依赖项添加到类路径中。

    注意:你可以直接从Maven Central repository下载jar。

    【讨论】:

    • 我要补充一点,将 dep 放在 provided 范围内可以满足 scalac 并且 lib 不会包含在打包的结果中。
    【解决方案3】:

    你可以添加这个依赖:

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

    因此编译将起作用,而这不会出现在最终版本中。

    【讨论】:

      猜你喜欢
      • 2020-04-25
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多