Как избежать несовместимости электронных таблиц Google API с календарем

В моем проекте GAE/J я пытаюсь использовать API Google, электронные таблицы и календарь.

Но CONTAINER Spreadsheets API включает файл google-collect-1.0-rc1.jar, который включает старую версию класса Joiner.

Календарю требуется его более новая версия (с методом on()), которая поставляется с guava-jdk5-13.0.jar, то есть в КОНТЕЙНЕРЕ API календаря.

Когда запускается код календаря, класс Joiner разрешается (чтобы он был более старой версией) и завершается ошибкой NoSuchMethod.

Это означает, что они несовместимы. Я пробовал несколько настроек classpath без везения. Доступ к электронным таблицам работает, но доступ к календарю не работает.

Кто-нибудь еще видел это и нашел обходной путь?


person Andrew Mackenzie    schedule 04.03.2013    source источник
comment
Если вы переключитесь на Drive API, вам не придется беспокоиться о переключении между библиотекой GData и google-api-java-client. IIRC, API электронных таблиц в любом случае устарел.   -  person bossylobster    schedule 05.03.2013
comment
bossylobster — API электронных таблиц v3.0 находится здесь, только версии v1 и v2 устарели: developers.google .com/google-apps/spreadsheets (я считаю, что это быстрее, чем скрипт приложений Google, хотя у GAS больше функций)   -  person eddyparkinson    schedule 05.03.2013


Ответы (2)


попробуйте удалить класс Joiner из google-collect-1.0-rc1.jar — я удалил классы из нескольких файлов jar, не очень чисто, но работает нормально.

person eddyparkinson    schedule 05.03.2013
comment
Это то, что я сделал в конце, используя JarPlug BTW. Это не так устойчиво к изменениям в версии API электронных таблиц и JAR, которым управляет Eclipse... но работает. - person Andrew Mackenzie; 10.03.2013

'google-collect-1.0-rc1.jar устарел и был заменен jar 'guava', который описан здесь: https://code.google.com/p/guava-libraries/wiki/GuavaExplained

проблема в том, что, как утверждает OP, некоторые API Google действительно несовместимы и требуют очень осторожного обращения. Например, Google Spreadsheets API по-прежнему поставляется в комплекте с google-collect-1.0-rc1.jar.

для получения дополнительной информации см.: https://code.google.com/p/gdata-java-client/issues/detail?id=344

вот что я сделал, чтобы заставить календари (Oauth) работать с электронными таблицами (используя клиентские библиотеки):

  • не используйте подключаемый модуль Eclipse для управления API Google — я обнаружил, что он работает в DEV, но как только я разверну его в GAE, он не работает, я думаю, потому что процесс развертывания копирует jar-файлы, найденные в каталоге, который он использует: '. google_apis/' — это вызывает такие ошибки во время выполнения, как:

Причина: java.lang.NoSuchMethodError:
com.google.common.collect.ImmutableSet.of([Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSet;

Управление банками вручную также позволяет при необходимости переключать банки, как описано выше.

  • не все версии библиотек "java client" одинаковы, даже если они могут иметь одно и то же имя, например. 'gdata-client-1.0.jar' Вам нужно использовать новый, если вы хотите, чтобы он зависел от Guava, а не от старого jar-коллекции: (например, 1.4.7.1 - загрузите здесь https://code.google.com/p/gdata-java-client/)
  • будьте осторожны, чтобы вручную удалить и повторно скопировать ваши банки в war/WEB-INF/lib, поскольку eclipse не будет полностью управлять этим для вас (особенно если вы обновляете банку с тем же именем)
  • наконец, совет, который поможет отследить ошибки времени выполнения, решив, из каких файлов вы получаете свои зависимости:

System.out.println("URL: " + Thread.currentThread().getContextClassLoader().getResource("com/google/common/collect/ImmutableSet.class"));

person doright    schedule 06.03.2013
comment
Чтобы расширить: я обнаружил, что это работает в DEV, но как только я развернул его в GAE, это не сработало ---- порядок загрузки jar-файлов может измениться, порядок загрузки вызывает проблемы с GAE. Когда в файлах jar существуют две версии класса, это может привести к тому, что GAE попытается использовать неправильную версию класса. - person eddyparkinson; 07.03.2013