2012-04-04 20 views
19

Tôi có tập tin scala sau:Tại sao tôi cần jsr305 để sử dụng ổi trong scala?

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

tôi biên dịch với ổi-11.0.2.jar trong classpath. scala 2.9.1 biên dịch của tôi (cả thực plugin và scalac đồng bằng) than phiền:

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) 

Để biên dịch, tôi cần phải thêm JSR305 (jsr305-1.3.9.jar) để build path. Việc biên dịch tương đương java chỉ tốt mà không cần jsr305:

public class JGuavaTryout { 
    public void tryout() { 
    com.google.common.cache.CacheBuilder.newBuilder(); 
    } 
} 

Bất kỳ ý tưởng nào tại sao scala yêu cầu jsr305? Có thực hiện jsr305 chính thức để sử dụng với ổi không?

Cảm ơn! - Georg

Trả lời

21

Đó là do cách trình biên dịch Scala được thiết kế, nó đòi hỏi tất cả các loại được lớp sẵn sàng hiển thị vào lúc biên dịch, trong khi trình biên dịch Java không quan tâm một cách hiệu quả.

+2

Trình biên dịch Java đặc biệt không quan tâm đến các loại chú thích, nhưng tôi nghĩ rằng tất cả các loại khác cần phải có sẵn. –

+2

Scala 2.11.1 trở lên bây giờ xử lý các chú thích còn thiếu một cách duyên dáng; bạn không còn cần jsr305 trên classpath nữa. – retronym

21

Sean Parsons trả lời câu hỏi đầu tiên của bạn, bằng cách giải thích lý do tại sao Scala yêu cầu phụ thuộc JSR 305.

Như để "chính thức" JSR 305 thực hiện để sử dụng với ổi, tôi muốn sử dụng một họ tuyên bố trong pom.xml của họ:

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

Nếu bạn đang sử dụng Maven, tôi nghĩ rằng nó sẽ thêm sự phụ thuộc đến classpath tự động.

Lưu ý: bạn có thể tải xuống bình trực tiếp từ Maven Central repository.

+8

Tôi sẽ thêm rằng việc đặt dep trong phạm vi 'được cung cấp' thỏa mãn scalac và lib không được đưa vào kết quả đóng gói. – ron

6

Bạn có thể thêm phụ thuộc này:

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

do đó biên soạn sẽ làm việc và điều này sẽ không đến với phiên bản chính thức.

Các vấn đề liên quan