Google云端存储:无法初始化类OauthRawGcsServiceFactory

时间:2014-06-21 07:06:13

标签: java google-app-engine google-cloud-storage

我正在尝试使用Google云端存储客户端库在Appengine上进行简单的上传和下载。

在执行期间,它会返回以下错误:

java.lang.NoClassDefFoundError: Could not initialize class com.google.appengine.tools.cloudstorage.oauth.OauthRawGcsServiceFactory
    at com.google.appengine.tools.cloudstorage.GcsServiceFactory.createRawGcsService(GcsServiceFactory.java:42)
    at com.google.appengine.tools.cloudstorage.GcsServiceFactory.createGcsService(GcsServiceFactory.java:34)

错误指向此处:

    @Override
    public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException {
        GcsFilename fileName = getFileName( request );

        GcsInputChannel readChannel = gcsService.openPrefetchingReadChannel(fileName, 0, BUFFER_SIZE);
        copy(Channels.newInputStream(readChannel), response.getOutputStream());
    }

    @Override
    public void doPost( HttpServletRequest request, HttpServletResponse response ) throws IOException {
        GcsOutputChannel outputChannel = gcsService.createOrReplace( getFileName(request), GcsFileOptions.getDefaultInstance() );
        copy( request.getInputStream(), Channels.newOutputStream(outputChannel) );
    }

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

/war/WEB-INF/lib/文件夹中缺少一个必需的罐子。

首先,如果您使用Eclipse,请检查“问题”选项卡中是否有关于服务器上无法使用的资源的警告。如果看到它们,请右键单击“QuickFix”并选择“复制到...”选项。如果您不使用Eclipse,请手动检查。

如果这没有帮助,请检查您是否包含了项目所需的所有依赖项:

https://code.google.com/p/google-api-java-client/wiki/Setup#Download_Library_with_Dependencies

答案 1 :(得分:1)

此问题的可能原因之一是缺少GCS库所需的库。当谷歌在他们的文档中声明你需要1)Guava,2)Joda-Time,3)云存储API客户端库 - 他们不是在开玩笑。

问题是,您不需要这些库来在开发服务器上运行您的应用程序。您的应用程序在本地工作正常。但是,当您将其上传到Google时,您会收到带有错误消息的NoClassDefFoundError:它会报告OAuthRawGcsServiceFactory或URLFetchUtils,即使缺少的类在Joda或CS API中。

一旦您包含了Google所需的所有,您的项目(希望如此)将会有效。可以在Appengine Docs页面上找到这些库的下载链接:https://cloud.google.com/appengine/docs/java/googlecloudstorageclient/download

答案 2 :(得分:0)

始终使用Maven或Ivy等工具来解决依赖关系。将JAR复制到war/WEB-INF/lib/目录并手动编辑.classpath文件将会非常痛苦,并且可能无法帮助您。如果您使用Eclipse& Google App Engine插件,使用添加Google API ... ,如此处所述 - Google Plugin for Eclipse。就我而言,通过Google Plugin for Eclipse添加 Cloud Storage API 有助于解决此问题NoClassDefFoundError