首页 > 解决方案 > 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>-->

标签: javamavengoogle-cloud-platformpom.xml

解决方案


正如我在评论中所解释的,这是不可能的。客户端库是自动生成的(基于发现 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 客户端库!


推荐阅读