2012-04-04 32 views
19

我有以下斯卡拉文件:为什么我需要jsr305在scala中使用番石榴?

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

我在classpath番石榴11.0.2.jar编译。我的斯卡拉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实现与番石榴一起使用?

谢谢! - Georg

回答

21

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

+2

Java编译器特别不关注注释类型,但我认为所有其他类型都需要可用。 – 2012-11-14 08:22:57

+2

斯卡拉2.11.1及以上版本现在优雅地处理缺失的注释;您不再需要classpath上的jsr305。 – retronym 2014-11-13 04:28:17

21

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

至于“官方” JSR 305实现与番石榴使用,我会使用他们在pom.xml声明一个:如果你使用Maven

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

,我认为这将增加的依赖自动到类路径。

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

+8

我会补充说,将dep放在'provided'范围内可以满足scalac,lib不会包含在打包结果中。 – ron 2012-08-26 10:09:01

6

您可以添加此依赖性:

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

因此编译将工作,这会不会走到最后释放。