Использование интерфейсов предикатов и функций Guava 10 с GWT 2.4.0

#java #gwt #guava

#java #gwt #guava

Вопрос:

Поддерживаются ли Predicate s и Function s в GWT 2.4.0 и Guava GWT 10.0.1? Оба интерфейса помечены как @GwtCompatible .

При запуске проекта в режиме отладки, размещенном на хостинге, я получаю ошибки проверки во время выполнения при использовании Predicate :

[ОШИБКА] [MyProject] — Строка XXY: импорт javax.аннотации.Значение Null не может быть разрешено

[ОШИБКА] [MyProject] — Строка YYY: значение Null не может быть преобразовано в тип

Из других сообщений StackOverflow я полагаю, что эти ошибки не должны требовать включения JSR 305 в path начиная с версии Guava 09 (включение JSR 305 в path в любом случае не решило проблему).

Я также, похоже, получаю пару ошибок несоответствия интерфейса:

[ОШИБКА] [MyProject] — Строка XXX: Тип new Function(){} должен реализовывать унаследованный абстрактный метод Function.apply(Object)

[ОШИБКА] [MyProject] — Строка ГГГГ: Метод apply(MyType) типа new Function(){} должен переопределять или реализовывать метод супертипа

и аналогичные ошибки при использовании Predicate , которые я представил как ошибку:http://code.google.com/p/guava-libraries/issues/detail?id=765

Есть идеи относительно того, что может быть не так с моей настройкой?

Мой проект.gwt.xml файл содержит следующие строки:

 <inherits name="com.google.common.collect.Collect" />
<inherits name="com.google.common.base.Base" />
  

Мой java-файл включает в себя следующие импортные файлы:

 import com.google.common.base.Function;
import com.google.common.base.Predicate;
  

Я использую Eclipse 3.7.1 и JavaSE-1.6

Комментарии:

1. Какой JAR вы включаете в свой проект webapp? guava-10.0.1.jar или guava-gwt-10.0.1.jar ?

2. @Strelok: оба находятся в war / WEB-INF / lib и пути сборки проекта (как не внешние JAR).

3. Функция и предикат используются в преобразовании и фильтрации. Проверьте эти импортированные файлы. У меня была проблема с несоответствующими методами, потому что Transform поступал откуда-то извилисто, а не из google.common.

Ответ №1:

У меня только что была такая же проблема, и я нашел решение для этого. Проблема в том, что исходный код JSR 305 не является частью модуля GWT и поэтому игнорируется GWT. Чтобы исправить это, выполните следующее:

  • Добавьте дескриптор модуля GWT в jsr305-2.0.0.jar . Внутри jar, который должен содержать по крайней мере исходные файлы Java во вложенной папке, javax/annotation добавьте файл Annotation.gwt.xml со следующим содержимым:
 <?xml version="1.0" encoding="UTF-8"?>
<module>
    <source path="" />
</module>
  
  • Добавьте измененный jsr305-2.0.0.jar к пути к классу вашего проекта GWT в eclipse. Хотя указано в другом месте, не требуется добавлять этот jar в WEB-INF/lib

  • Позвольте модулям вашего проекта наследовать от вновь созданного модуля GWT, добавив следующую строку в .gwt.xml файлы ваших модулей:

 <inherits name='javax.annotation.Annotation'/>
  

Вот и все! Теперь ваш проект eclipse будет успешно скомпилирован, и режим разработки / размещения тоже будет работать.

Ответ №2:

Это своего рода известная ошибка, которую вам нужно иметь jsr305.jar в вашей WEB-INF / lib это все.

Еще одна вещь, на которую следует обратить внимание, — это тот факт, что части guava собраны в side GWT *.jar, но там они помещены в отдельный пакет com.google.gwt.thirdparty.guava.common….. И, как это часто бывает с eclipse, при разрешении импорта он захватывает неправильный импорт, и это приводит к беспорядку во время выполнения, поскольку классы, упакованные в com.google.gwt.thirdparty.guava, взяты из другой версии и На НИХ НЕЛЬЗЯ ссылаться.

Мой совет:

Выполните текстовый поиск во всех ваших файлах * .java для «сторонней» подстроки и замените ее правильным импортом — у меня это сработало.

Немного более глубокое объяснение заключается в том, что в предыдущих версиях Guava jsr305 был включен в guava jar, но в этом выпуске они его удалили, и зависимость от него появляется в Maven pom библиотеки, но не была хорошо документирована на веб-сайте. Это вызвало много путаницы среди пользователей.