我有一个多模块项目,其中每个模块都可以很好地部署到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文件,并将合同和基本测试类保留在服务模块中。我看过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,看看杰罗姆的答案,也是here。
解决方案1:
从上一个块中删除deployAtEnd选项,它将是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${maven-deploy-plugin.version}</version>
</plugin>
解决方案2:
尽管他们不需要,但在所有模块中配置插件。这样做:
<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>
<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>