我有以下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实现?
谢谢! - 乔治
答案 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>
因此编译将起作用,这将不会到达最终版本。