Ответ 1
Что из-за того, как был разработан компилятор Scala, он требует, чтобы все типы, открытые классом, были доступны во время компиляции, тогда как компилятору Java фактически все равно.
У меня есть следующий scala файл:
object SGuavaTryout {
com.google.common.cache.CacheBuilder.newBuilder()
}
Я компилирую с guava-11.0.2.jar в пути к классам. Мой компилятор scala 2.9.1 (как плагин eclipse, так и plain 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) в путь сборки. Java-эквивалент компилируется просто отлично без jsr305:
public class JGuavaTryout {
public void tryout() {
com.google.common.cache.CacheBuilder.newBuilder();
}
}
Любые идеи, почему scala требует jsr305? Есть ли официальная реализация jsr305 для использования с guava?
Спасибо! - Георг
Что из-за того, как был разработан компилятор Scala, он требует, чтобы все типы, открытые классом, были доступны во время компиляции, тогда как компилятору Java фактически все равно.
Шон Парсонс ответил на ваш первый вопрос, объяснив, почему Scala требует зависимости JSR 305.
Что касается "официальной" реализации JSR 305 для использования с Guava, я бы использовал ту, которую они объявляют в pom.xml:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
</dependency>
Если вы использовали Maven, я думаю, что он автоматически добавит зависимость к пути к классам.
Примечание: вы можете загрузить банку непосредственно из репозитория Maven Central.
Вы можете добавить эту зависимость:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>2.0.3</version>
<scope>provided</scope>
</dependency>
таким образом, компиляция будет работать, и это не придет к окончательной версии.