【发布时间】:2017-04-04 17:50:30
【问题描述】:
我正在尝试将在 Google 应用引擎中运行的应用从使用 BlobstoreService 接口迁移到较新的云存储,但没有成功。
为了让事情变得更简单,我从头开始尝试运行 Google 提供的示例之一 (GitHub)。我正在使用 Eclipse 4.6、Google Cloud SDK149.0.0 和 1.9.50 的 app-engine java 版本。尽管在本地环境中不起作用(我预料到),但代码编译得完美无缺。但是,当在 GAE 中部署时,它在运行时会失败并出现 NoClassDefFoundError:
servlet 未捕获的异常 java.lang.NoClassDefFoundError: com/google/api/services/storage/Storage$Builder 在 com.google.appengine.tools.cloudstorage.oauth.OauthRawGcsService.(OauthRawGcsService.java:175) 在 com.google.appengine.tools.cloudstorage.oauth.OauthRawGcsServiceFactory.createOauthRawGcsService(OauthRawGcsServiceFactory.java:41) 在 com.google.appengine.tools.cloudstorage.GcsServiceFactory.createRawGcsService(GcsServiceFactory.java:59) 在 com.google.appengine.tools.cloudstorage.GcsServiceFactory.createGcsService(GcsServiceFactory.java:44) 在 com.google.appengine.tools.cloudstorage.GcsServiceFactory.createGcsService(GcsServiceFactory.java:40) 在 com.clopez.storage.NewUpload.doPost(NewUpload.java:53)
我的代码(实际上是 Google 自己的代码)在以下位置失败:
GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
正如我在其他几篇 Stackoverflow 帖子中所读到的,这通常是由于我的 WEB-INF/lib 目录中不存在 jar,因此我在其中包含了 appengine-api-1.0-sdk-1.9.50.jar, appengine-gcs-client-0.6、com.google.guava_20.0.0、joda-time-2.9.9 以及最新 Google Java Client API 中的所有 jar。部署后我的 WEB-INF 目录如下:
Stackoverflow doesn't allow me to show pictures here, so here's the link
但是这一直失败,我很惊讶。我不知道如何继续前进。
【问题讨论】:
-
完成了同样的错误结果。该帖子中建议的 jar 集合 [the Cloud Storage JSON API Client Library for Java](developers.google.com/api-client-library/java/apis/storage/v1) 是我正在使用的 Google Java Client API 的子集
-
这就是解决方案!!!
-
我没有使用 Maven,所以我需要手动将所有需要的 jar 包含到 WEB-INF/lib 中。即使我复制了 google-api-services-storage-v1-rev104-java-1.22.0.zip 包中的所有库,我也忘记包含主要库(不在该包中的 libs 目录下)。简而言之,将 google-api-services-storage-v1-rev104-1.22.0.jar 放到 Eclipse 的 WEB-INF/lib 目录中就可以了。非常感谢。
标签: java eclipse google-app-engine google-cloud-storage