Контракт Spring Cloud не развертывается в Artifactory в многомодульных проектах Maven

У меня есть многомодульный проект, в котором каждый модуль нормально развертывается в Artifactory, пока я не добавлю плагин spring-cloud-contract-maven-plugin к одному из модулей (сервис, поскольку это API производителя).

Структура проекта такая:

parent
- common (shared DTOs)
- client
- service

Мы хотим удалить клиента и общее в будущем и иметь клиентов Feign в потребителях для уменьшения связи, и иметь базовый проект без внутренних модулей, но сейчас мы должны сохранить эту структуру.

Сначала я заметил, что заглушки не были отправлены в Artifactory, поэтому моим первоначальным решением было добавить это в конвейер Jenkins.

sh './mvnw clean deploy -U --projects=xxx-service'

Он развертывает службу и заглушки, но я заметил, что ни один из модулей не развертывается при выполнении этой команды:

sh './mvnw clean deploy -U'

Это конец вывода:

[INFO] Installing /xxx/xxx-service/target/xxx-service-1.7.0-SNAPSHOT.jar to /xxx/.m2/repository/xxx/xxx-service/1.7.0-SNAPSHOT/xxx-service-1.7.0-SNAPSHOT.jar
[INFO] Installing /xxx/xxx-service/pom.xml to /xxx/.m2/repository/xxx/xxx-service/1.7.0-SNAPSHOT/xxx-service-1.7.0-SNAPSHOT.pom
[INFO] Installing /xxx/xxx-service/target/xxx-service-1.7.0-SNAPSHOT-stubs.jar to /xxx/.m2/repository/xxx/xxx-service/1.7.0-SNAPSHOT/xxx-service-1.7.0-SNAPSHOT-stubs.jar
[INFO] 
[INFO] --- maven-deploy-plugin:2.8.2:deploy (default-deploy) @ xxx-service ---
[INFO] Deploying xxx:xxx-service:1.7.0-SNAPSHOT at end

Я попытался переместить всю конфигурацию Maven в родительский файл POM и сохранить контракты и базовые тестовые классы в служебном модуле. Я просмотрел эту страницу, который объясняет, как настроить плагин, и я увидел, что могу использовать контрактыDirectory, чтобы указать каталог файлов контрактов, gmavenplus-plugin, чтобы указать каталог сгенерированных тестов, и packageWithBaseClasses, чтобы указать пакет базовых классов. Однако я не вижу возможности указать каталог базовых классов. Я не могу переместить базовые тестовые классы в родительский, потому что они используют некоторые классы служебного модуля для создания макетов.

Есть ли способ сделать это или мне придется создавать отдельный проект для контрактов?

заранее спасибо


person rafaborrego    schedule 12.12.2017    source источник
comment
Можете ли вы загрузить где-нибудь свой образец, чтобы я мог его проверить?   -  person Marcin Grzejszczak    schedule 18.12.2017
comment
Я создал сокращенную версию проекта, и она отлично работает, поэтому возникает конфликт с некоторой конфигурацией, чего нет в других проектах, которые у меня есть с одним модулем. Похоже, что проблемы вызваны настраиваемым родительским проектом, который расширяет spring-boot-starter-parent. Развертывание моего API работает нормально, если я копирую в него код этого родителя, но не в том случае, если он расширяет его. Интересно, что это сработает, если я удалю строку ‹extensions› из конфигурации плагина, но тогда она не будет генерировать заглушки. Я продолжу расследование и опубликую дополнительную информацию. Спасибо   -  person rafaborrego    schedule 19.12.2017
comment
Похоже, это связано с: issues.apache.org/jira / plugins / servlet / mobile # issue / MDEPLOY-193, как описано здесь: stackoverflow.com/questions/36328154/. Постараюсь разобраться, как конфликтуют плагины и как это решить   -  person rafaborrego    schedule 19.12.2017
comment
Мне удалось заставить его работать с обходным путем, и я также нашел правильное решение, которое удаляет deployAtEnd из конфигурации maven-deploy-plugin. Я задокументировал и то, и другое в ответе.   -  person rafaborrego    schedule 19.12.2017


Ответы (1)


Причина проблемы:

У меня это было в родительском проекте, расширенном моим API:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>${maven-deploy-plugin.version}</version>
        <configuration>
            <deployAtEnd>true</deployAtEnd>
        </configuration>
    </plugin>

Почему это проблема:

Кажется, что maven-deploy-plugin конфликтует с многомодульными проектами с плагинами, которые используют расширения, такие как spring-cloud-contract-maven-plugin. здесь, см. ответ Джерома, который также находится здесь.

Решение 1.

Удалите опцию deployAtEnd из предыдущего блока, чтобы она была:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>${maven-deploy-plugin.version}</version>
    </plugin>

Решение 2:

Настройте плагин во всех модулях, хотя он им не нужен. Для этого:

  • Добавьте пустую папку «контракты» в src / test / resources на всех модулях.

  • Добавьте это в pom-файл служебного модуля:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-contract-maven-plugin</artifactId>
            <version>${spring-cloud-contract.version}</version>
            <extensions>true</extensions>
            <configuration
                <baseClassForTests>com.xxx.BaseContractTest</baseClassForTests>
            </configuration>
        </plugin>
    </plugins>
</build>
  • Добавьте это в pom-файл других модулей:
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-contract-maven-plugin</artifactId>
            <version>${spring-cloud-contract.version}</version>
            <extensions>true</extensions>
        </plugin>
    </plugins>
</build>
person rafaborrego    schedule 19.12.2017