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

Geo*_*org 19 scala guava

我有以下scala文件:

object SGuavaTryout {
  com.google.common.cache.CacheBuilder.newBuilder()
}
Run Code Online (Sandbox Code Playgroud)

我在类路径中使用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)
Run Code Online (Sandbox Code Playgroud)

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

public class JGuavaTryout {
  public void tryout() {
    com.google.common.cache.CacheBuilder.newBuilder();
  }
}
Run Code Online (Sandbox Code Playgroud)

scala需要jsr305的任何想法?是否有官方的jsr305实现与番石榴一起使用?

谢谢! - 乔治

Sea*_*ons 21

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

  • Java编译器特别关注注释类型,但我认为所有其他类型都需要可用. (2认同)
  • Scala 2.11.1及更高版本现在可以优雅地处理缺失的注释; 你不再需要类路径上的jsr305. (2认同)

Eti*_*veu 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>
Run Code Online (Sandbox Code Playgroud)

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

注意:您可以直接从Maven Central存储库下载jar .

  • 我想补充说,将dep放在`provided`范围内满足scalac并且lib不会包含在打包结果中. (8认同)

igr*_*eld 6

您可以添加此依赖项:

<dependency>
    <groupId>com.google.code.findbugs</groupId>
    <artifactId>jsr305</artifactId>
    <version>2.0.3</version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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