我正在尝试使用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) );
}
我该如何解决这个问题?
答案 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
。