为什么我需要jsr305才能在scala中使用guava?

时间:2012-04-04 09:01:07

标签: scala guava

我有以下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?是否有与guava一起使用的官方jsr305实现?

谢谢! - 乔治

3 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:21)

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

答案 2 :(得分:6)

您可以添加此依赖项:

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

因此编译将起作用,这将不会到达最终版本。