NoSuchMethod获取gdata服务时出错

时间:2012-02-10 04:24:10

标签: java service youtube gdata gdata-api

我收到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet.of([Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSet;
at com.google.gdata.wireformats.AltFormat$Builder.setAcceptableTypes(AltFormat.java:399)
at com.google.gdata.wireformats.AltFormat$Builder.setAcceptableXmlTypes(AltFormat.java:387)
at com.google.gdata.wireformats.AltFormat.<clinit>(AltFormat.java:49)
at com.google.gdata.client.Service.<clinit>(Service.java:558)
at testproject.TestProject.run(TestProject.java:22)
at testproject.TestProject.main(TestProject.java:31)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

这来自以下代码:

package testproject;

import com.google.gdata.client.youtube.YouTubeService;
import com.google.gdata.util.*;
import java.util.logging.*;

public class TestProject {

  public static void main(String[] args) {
    try {
      YouTubeService service = new YouTubeService("Test", "developerKey");
      service.setUserCredentials("root@gmail.com", "pa$$word");
    } catch (AuthenticationException ex) {
      Logger.getLogger(TestProject.class.getName()).log(Level.SEVERE, null, ex);
    }
  }
}

起初,我在http://code.google.com/p/gdata-java-client/downloads/list中包含了每个库,并且还导入了比我需要的更多的库。 我已经删除了我认为不必要的库(感谢thinksteep)。所以我目前包含的库是以下库:

mail.jar
activation.jar
ant.jar
gdata-core-1.0.jar
gdata-media-1.0.jar
guava-11.0.1.jar
gdata-youtube-2.0.jar
gdata-youtube-met-2.0.jar

(那里可能有一些图书馆没有必要......但我现在已经结束......) 我只是想测试一下YouTube服务,这样我就能搞定这个项目,但没有骰子。哦,我还包括了这个库:http://code.google.com/p/guava-libraries因为在我收到NoClassDefFound错误并包含该库似乎解决了它之前。提前感谢您的帮助! 哦,我也在gdata getting started guide中完全遵循了每一步(或者至少我是这么认为)。我的测试版本在最后成功了......再次感谢!

8 个答案:

答案 0 :(得分:12)

添加超过要求可能也会引起问题。如果运行时找不到具有精确签名的必需方法,则通常会发生java.lang.NoSuchMethodError错误。可能的原因是:

1) There might be mulitple jars with same code, which may cause wrong class get loaded.

2) Incompatable version of jar, the jar you have in classpath might be older version/newer version.

确保没有发生这种情况。

答案 1 :(得分:4)

最新版本的gdata问题仍然引用旧的番石榴方法

退房 http://code.google.com/p/gdata-java-client/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=&id=344

<强>解决方案

我切换到位于的guava-r07.jar http://code.google.com/p/guava-libraries/downloads/detail?name=guava-r07.zip&can=4&q=

这让我过去了 ContactsService service = new ContactsService(“”);

Jar正在使用中:

  • 默认Eclipse插件jar的
  • gdata-base-1.0.jar
  • gdata-client-1.0.jar
  • GDATA触点-3.0.jar
  • gdata-core-1.0.jar
  • gdata-media-1.0.jar
  • 番石榴r07.jar

  • Apache(servlet-api.jar)

  • JavaMail(mail.jar)
  • JavaBeans Activation Framework(activation.jar)

答案 2 :(得分:0)

我不知道它是否仍然相关,但我有同样的例外

guava 11.02.jar(目前是最新版本)存在问题

使用guava-10.0.1时(可以找到here)一切顺利。

答案 3 :(得分:0)

必需的库jar如下。

gdata-client-1.0.jar
gdata-core-1.0.jar
gdata-media-1.0.jar
gdata-youtube-2.0.jar
guava-11.0.2.jar
java-mail-1.4.4.jar

我正在使用上面提到的库。请利用它;因为最终目的是获取YouTubeService对象。请查看下面的代码段。

package com.baba.test;
/*
* Author : Somanath Nanda
*/


import java.net.MalformedURLException;
import java.net.URL;
import com.google.gdata.client.youtube.YouTubeQuery;
import com.google.gdata.client.youtube.YouTubeService;
public class Test {
private static final String CLIENT_ID = "XXXXXXXX.XXXXX.XXX.XXX";
private static final String DEVELOPER_KEY = "*********************************88";
public static void main(String[] args) throws MalformedURLException {
YouTubeService service = new YouTubeService(CLIENT_ID,DEVELOPER_KEY);
System.out.println("Service : "+service);
}

答案 4 :(得分:0)

如果您正在使用构建工具(例如Maven),那么您可以在我的pom.xml中的一部分依赖项部分中执行类似于以下示例的操作:

<!-- The mail dependency is required BEFORE the javaee-api dependency.
         The gdata dependency (YouTube API) requires the mail dependency. -->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.google.gdata</groupId>
        <artifactId>core</artifactId>
        <version>1.47.1</version>
    </dependency>

答案 5 :(得分:0)

我已将googlecollection-exp.jar添加到我的构建路径中,然后前一个execption就消失了。

答案 6 :(得分:0)

注意这个jar gdata-core-1.0.jar我有同样的问题,我意识到我有这个jar gdata-core-1.0.jar的问题,我发现从网站上同样的jar gdata-core- 1.0.jar,但内容不同。在我更换了新的gdata-core-1.0.jar之后,问题就解决了。

因此具有相同名称但其内容不同的jar是很棘手的。你以为你有罐子,实际上它不是正确的

答案 7 :(得分:0)

可能是您的某些jar依赖于google / guava jar,如果它们不在构建路径中,或者如果存在多个,则可能会导致不一致,从而导致错误。一种快速的解决方案是将最新版本的番石榴添加到您的pom中

 <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>24.0-jre</version>
    </dependency>

现在检查依赖关系层次结构中,除番石榴之外的任何Jar是否都引用了其他任何较旧的番石榴/ google-collection jar。如果是这样,那就排除它,像这样

<exclusions>
            <exclusion>
                <groupId>com.google.collections</groupId>
                <artifactId>google-collections</artifactId>
            </exclusion>
 </exclusions>