Spring Cloud Contract 未部署到 Maven 多模块项目中的 Artifactory
Spring Cloud Contract not deploying to Artifactory in Maven multi module projects
我有一个多模块项目,其中每个模块都可以很好地部署到 Artifactory,直到我将 spring-cloud-contract-maven-plugin 添加到其中一个模块(服务,因为它是生产者 API).
项目结构如下:
parent
- common (shared DTOs)
- client
- service
我们想在未来去掉client和common,在consumers中加入Feign clients来降低耦合度,并且有一个没有内部模块的基础项目,但是现在我们必须保持这个结构。
我首先注意到存根没有被推送到 Artifactory,所以我最初的解决方法是将其添加到 Jenkins 管道中
sh './mvnw clean deploy -U --projects=xxx-service'
它部署了服务和存根,但我注意到在执行此命令时部署了 none 个模块:
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 文件,并在服务模块中保留合同和基础测试 类。我看过 this page 解释了如何配置插件,我看到我可以使用 contractsDirectory 指定合同文件的目录,gmavenplus-plugin 指定生成的测试目录和 packageWithBaseClasses 指定基础包 类。但是我看不到任何指定基础目录的方法 类。我无法将基础测试 类 移至父级,因为它们使用服务模块的一些 类 来生成模拟。
有什么方法可以做到,或者我必须为合同创建一个单独的项目?
提前致谢
问题原因:
我在 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 等扩展插件的多模块项目冲突。 here, look to the answer of Jerome that is also here 记录了一个已知问题。
解决方案一:
从上一个块中删除 deployAtEnd 选项,这样它将是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${maven-deploy-plugin.version}</version>
</plugin>
方案二:
在所有模块中配置插件,尽管它们不需要它。为此:
在所有模块src/test/resources下添加一个空的"contracts"文件夹
将此添加到服务模块的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>
我有一个多模块项目,其中每个模块都可以很好地部署到 Artifactory,直到我将 spring-cloud-contract-maven-plugin 添加到其中一个模块(服务,因为它是生产者 API).
项目结构如下:
parent
- common (shared DTOs)
- client
- service
我们想在未来去掉client和common,在consumers中加入Feign clients来降低耦合度,并且有一个没有内部模块的基础项目,但是现在我们必须保持这个结构。
我首先注意到存根没有被推送到 Artifactory,所以我最初的解决方法是将其添加到 Jenkins 管道中
sh './mvnw clean deploy -U --projects=xxx-service'
它部署了服务和存根,但我注意到在执行此命令时部署了 none 个模块:
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 文件,并在服务模块中保留合同和基础测试 类。我看过 this page 解释了如何配置插件,我看到我可以使用 contractsDirectory 指定合同文件的目录,gmavenplus-plugin 指定生成的测试目录和 packageWithBaseClasses 指定基础包 类。但是我看不到任何指定基础目录的方法 类。我无法将基础测试 类 移至父级,因为它们使用服务模块的一些 类 来生成模拟。
有什么方法可以做到,或者我必须为合同创建一个单独的项目?
提前致谢
问题原因:
我在 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 等扩展插件的多模块项目冲突。 here, look to the answer of Jerome that is also here 记录了一个已知问题。
解决方案一:
从上一个块中删除 deployAtEnd 选项,这样它将是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${maven-deploy-plugin.version}</version>
</plugin>
方案二:
在所有模块中配置插件,尽管它们不需要它。为此:
在所有模块src/test/resources下添加一个空的"contracts"文件夹
将此添加到服务模块的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>