GCP Java SDK — диспетчер облачных ресурсов конфликтующие зависимости для функциональности проекта и папки

#java #maven #google-cloud-platform #pom.xml

# #java #maven #google-облачная платформа #pom.xml

Вопрос:

Я пытаюсь использовать функциональность из V1 и V2 диспетчера облачных ресурсов для GCP. V1 имеет функциональность для проектов, не найденных при импорте POM для V2, а V2 имеет функциональность для папок, не найденных при импорте POM для V1. Импорт обоих просто вызывает конфликт. Я могу либо создать проект с использованием версии V1, либо создать папку с использованием версии V2.

Мой вариант использования требует от меня использования обеих функций, как правильно создать проект и папку для библиотеки Java GCP?

com.google.api.services.cloudresourcemanager.model.Project -> Работает в версии V1, а не в версии V2 импорт CloudResourceManager

 /*(crm is an instance of CloudResourceManager)*/ crm.projects().create(project);
 

com.google.api.services.cloudresourcemanager.model.Папка -> Работает в версии V2, а не в версии V1 импорт CloudResourceManager

 /*(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/

Я полагаю, что существует методология, которую я упускаю из виду, касающаяся того, как я должен создавать как папки GCP, так и проекты в java при использовании их SDK. Ниже приведены ошибки импорта 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>-->
 

Комментарии:

1. Вы не можете объединить пакеты SDK. Перепишите свой вопрос, чтобы показать, какие функции вам нужны из библиотек V2. Конечно, вы можете написать свой собственный код, используя REST API, чтобы добавить недостающие функции.

2. Я обновил два вызова метода, которые являются проблематичными в зависимости от версии SDK @JohnHanley

3. Я смущен вашим редактированием. Какая функциональность отсутствует в версии 2? Поскольку вы не можете смешивать библиотеки, выберите V1 или V2 и создайте вопрос по этой версии.

4. Это определение плохого дизайна API. Версия V2 не включает определение API REST версии V1, и, таким образом, автоматически сгенерированная клиентская библиотека находится в конфликте и не может использоваться одновременно. У меня нет решения для клиентской библиотеки, я могу просто порекомендовать вам использовать непосредственно API, без автоматически сгенерированной клиентской библиотеки.

Ответ №1:

Как объяснено в моем комментарии, это невозможно. Клиентская библиотека генерируется автоматически (на основе API обнаружения). И поскольку API v2 не использует повторно определение / спецификацию v1 для проекта, а также потому, что использование 2 зависимостей одного и того же API невозможно, вы не можете использовать оба в одном проекте.

Решение заключается в непосредственном использовании API. Вот пример вызова API create project

         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!