19

我有以下 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 实现?

谢谢!- 乔治

4

3 回答 3

21

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

于 2012-04-04T10:20:31.167 回答
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 中央存储库下载 jar 。

于 2012-04-04T14:28:39.510 回答
6

您可以添加此依赖项:

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

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

于 2014-01-01T11:32:46.443 回答