#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 библиотеки, но не была хорошо документирована на веб-сайте. Это вызвало много путаницы среди пользователей.