0

我寫一個Java應用程序與在谷歌雲存儲文件交互。我發現gcloud-java,我正在努力工作。如何驗證自己與谷歌雲存儲的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 

顯然東西是錯誤與我的環境,但我有什麼做的,解決這個問題?我想改正我的環境,而不是對示例進行更改。

注:

  • 我在Windows 10上運行Cygwin中2.0.4
  • 我不是通過Maven的建設,但我假設這不是問題
+0

作爲一個更新,我就可以更容易地把事情用[WSL]工作(https://msdn.microsoft.com/en-us/commandline/wsl)比Cygwin的:) – dimo414

回答

1

原因gcloud auth login不起作用是因爲Java在Cygwin中運行不好,特別是在絕對路徑方面。

gcloud存儲您的設置,並在你的Cygwin的主目錄,~/.config/gcloud證書,但Java會通過System.getProperty("user.home")尋找他們在你的Windows 目錄。您可以指定應用程序應該通過CLOUDSDK_CONFIG環境變量查找此目錄,像這樣(請務必打電話java時,只能指定它,將它設置爲你的shell會依次突破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 .... 

公告那我們不需要指定一個項目,但是由於某種原因我們還沒有登錄。事實證明,該演示應用程序並沒有很好地報告認證錯誤。在main()方法的開始添加到AuthCredentials.createApplicationDefaults()的顯式調用報告了一個更爲有用的錯誤消息:

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環境變量去。但爲什麼不是gcloud爲我們配置的東西?它看起來像這實際上在圖書館bug;它應該現在能夠找到我們的登錄憑證。

在此期間,我們可以通過顯式指定的憑據路徑以及變通辦法:

$ CLOUDSDK_CONFIG=$(cygpath -w ~/.config/gcloud) \ 
    GOOGLE_APPLICATION_CREDENTIALS=$(cygpath -w ~/.config/gcloud)/application_default_credentials.json \ 
    java -cp GCloudDemo.jar com.google.gcloud.examples.storage.StorageExample list 
Bucket{name=...} 

成功!