我正在编写一个Java应用程序来与Google云端存储中的文件进行交互。我找到了gcloud-java
我试图开始工作。
查看他们的examples似乎我应该能够在使用gcloud
登录后简单地运行它们,但它似乎并没有起作用。我试图运行StorageExample
,其中说如果没有提供" 登录项目将会被使用"但是尽管登录我无法访问我的预测我是否指定它。
$ gcloud auth login
Your browser has been opened to visit:
https://accounts.google.com/o/oauth2/auth?....
Saved Application Default Credentials.
You are now logged in as [...].
Your current project is [...]. You can change this setting by running:
$ gcloud config set project PROJECT_ID
$ java -cp GCloudDemo.jar com.google.gcloud.examples.storage.StorageExample list
Exception in thread "main" java.lang.IllegalArgumentException: A project ID is required for this service but could not be determined from the builder or the environment. Please set a project ID using the builder.
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
at com.google.gcloud.ServiceOptions.<init>(ServiceOptions.java:317)
...
at com.google.gcloud.examples.storage.StorageExample.main(StorageExample.java:566)
$ java -cp GCloudDemo.jar com.google.gcloud.examples.storage.StorageExample ... list
Exception in thread "main" com.google.gcloud.storage.StorageException: Login Required
at com.google.gcloud.spi.DefaultStorageRpc.translate(DefaultStorageRpc.java:94)
at com.google.gcloud.spi.DefaultStorageRpc.list(DefaultStorageRpc.java:148)
...
at com.google.gcloud.examples.storage.StorageExample$ListAction.run(StorageExample.java:1)
at com.google.gcloud.examples.storage.StorageExample.main(StorageExample.java:579)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
"code" : 401,
"errors" : [ {
"domain" : "global",
"location" : "Authorization",
"locationType" : "header",
"message" : "Login Required",
"reason" : "required"
} ],
"message" : "Login Required"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
...
at com.google.gcloud.spi.DefaultStorageRpc.list(DefaultStorageRpc.java:138)
... 10 more
显然我的环境有问题,但我需要做些什么才能修复它?我想纠正我的环境,而不是对示例进行更改。
注意:
答案 0 :(得分:1)
gcloud auth login
不起作用的原因是因为Java与Cygwin没有很好的配合,特别是在绝对路径方面。
gcloud
将您的设置和凭据存储在Cygwin主目录~/.config/gcloud
中,但Java将通过{{3}在 Windows 主目录中查找它们}。您可以通过CLOUDSDK_CONFIG
环境变量指定应用程序在此目录中的位置,这样(确保仅在调用java
时指定它;为shell设置它将依次中断{{1 }}):
gcloud
请注意,我们没有必要指定项目,但由于某种原因我们仍然没有登录。事实证明,演示应用程序在报告身份验证错误方面做得不是很好。在$ CLOUDSDK_CONFIG=$(cygpath -w ~/.config/gcloud) \
java -cp GCloudDemo.jar com.google.gcloud.examples.storage.StorageExample list
Exception in thread "main" com.google.gcloud.storage.StorageException: Login Required
at ....
方法开头添加对AuthCredentials.createApplicationDefaults()
的显式调用会报告更有用的错误消息:
main()
所以现在我们至少要让Exception in thread "main" java.io.IOException: The Application Default Credentials are
not available. They are available if running in Google Compute Engine. Otherwise, the
environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a
file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials
for more information.
环境变量继续下去。但为什么我们没有GOOGLE_APPLICATION_CREDENTIALS
为我们配置东西?看起来它实际上是图书馆中的System.getProperty("user.home")
;它应该现在能够找到我们的登录令牌。
与此同时,我们也可以通过明确指定凭据路径来解决它:
gcloud
成功!