java - GCP Java SDK - 项目和文件夹功能的云资源管理器冲突依赖项
问题描述
我正在尝试使用 Cloud Resource Manager for GCP V1 和 V2 中的功能。V1 具有针对 V2 的 POM 导入中未找到的项目的功能,而 V2 具有针对 V1 的 POM 导入中未找到的文件夹的功能。导入两者只会导致冲突。我只能使用 V1 创建一个项目,或者使用 V2 创建一个文件夹。
我的用例要求我同时使用这两种功能,为 GCP Java 库创建项目和文件夹的正确方法是什么?
com.google.api.services.cloudresourcemanager.model.Project -> 在 V1 中工作,而不是 CloudResourceManager 的 V2 导入
/*(crm is an instance of CloudResourceManager)*/ crm.projects().create(project);
com.google.api.services.cloudresourcemanager.model.Folder -> 在 V2 中工作,而不是 CloudResourceManager 的 V1 导入
/*(crm is an instance of CloudResourceManager)*/
crm.folders().create(folder);
我应该为组合功能使用不同的 POM 导入吗?
https://developers.google.com/apis-explorer/#p/cloudresourcemanager/v1/ https://developers.google.com/apis-explorer/#p/cloudresourcemanager/v2/
我想有一种方法我忽略了关于我应该如何在使用他们的 SDK 时在 java 中创建 GCP 文件夹和项目。以下是有罪的 POM 导入(目前已注释掉一个)
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-cloudresourcemanager</artifactId>
<version>v2-rev20201111-1.30.10</version>
</dependency>
<!--V1 has different libraries then V2-->
<!--https://search.maven.org/artifact/com.google.apis/google-api-services-cloudresourcemanager/v1-rev20201111-1.30.10/jar-->
<!-- <dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-cloudresourcemanager</artifactId>
<version>v1-rev20201111-1.30.10</version>
</dependency>-->
解决方案
正如我在评论中所解释的,这是不可能的。客户端库是自动生成的(基于发现 API)。并且因为 API v2 不为项目重用 v1 定义/规范,并且因为使用同一个 API 的 2 个依赖项是不可能的,所以您不能在同一个项目中使用两者。
解决方案是直接使用 API。这里是调用创建项目 API 的示例
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
HttpRequestFactory factory = new NetHttpTransport().createRequestFactory(new HttpCredentialsAdapter(credentials));
GenericData createProjectData = new GenericData();
createProjectData.set("name","gib-test-crmapi");
createProjectData.set("project_id","gib-test-crmapi");
JsonHttpContent createProjectContent = new JsonHttpContent(JacksonFactory.getDefaultInstance(), createProjectData);
HttpRequest request = factory.buildPostRequest(new GenericUrl("https://cloudresourcemanager.googleapis.com/v1/projects"),createProjectContent);
JsonObjectParser parser = new JsonObjectParser(JacksonFactory.getDefaultInstance());
request.setParser(parser);
request.setThrowExceptionOnExecuteError(false);
HttpResponse httpResponse = request.execute();
int statusCode = httpResponse.getStatusCode();
if (statusCode != HttpStatusCodes.STATUS_CODE_OK) {
throw new IOException(
String.format(
"Unexpected Error code %s trying to getIDToken: %s",
statusCode, httpResponse2.parseAsString()));
}
InputStream content = httpResponse.getContent();
if (content == null) {
throw new IOException("Empty content from generateIDToken server request.");
}
GenericJson responseData = httpResponse.parseAs(GenericJson.class);
System.out.println(responseData.toPrettyString());
您只需要 Google auth 客户端库;包含在客户端库中。
例如,使用 Resource Manager V2 进行文件夹管理(比项目管理更复杂)并使用我的代码示例创建项目。不需要新的导入,Resource Manager v2 已经包含了 Google auth 客户端库!
推荐阅读
- python - Django runserver 错误:_frozen_importlib._DeadlockError:_ModuleLock('django.test.signals') 在 139824587568800 检测到死锁
- java - 如何通过线性节点中的索引使元素出列
- php - 如何获取每个变体的库存数量 woocommerce
- selenium - 无头谷歌浏览器:如何防止网站知道他们的窗口是否聚焦
- read-the-docs - 版本未显示在 readthedocs 中
- dataframe - pyspark中有没有办法计算唯一值
- security - vmware中的Security Onion监控界面
- asp.net-core - 是否可以在“加载用户配置文件”= false 的共享主机中使用带有 asp.net 核心的身份服务器?
- laravel - 在基于引导的刀片模板中添加背景图像
- mysql - 在spring boot中将所有mysql表数据转换成JSON