我希望maven在具有以下结构的多模块maven Java项目中报告未解决的依赖关系:
multi-module-java-app/
├── app1
│ ├── pom.xml
│ └── src
├── app2
│ ├── pom.xml
│ └── src
└── pom.xml
波姆斯在最下面。
背景:
Maven被用作依赖关系管理和构建工具。Artifactory是存储库管理器。工件可以在开发人员的环境或Jenkins构建服务器上使用本地maven构建。archive
Artifactory定期将工件移动到特殊的存储库,这是 all
存储库虚拟的一部分。
Maven将本地构建的工件缓存在Maven运行的计算机上的~/.m2目录中,无论是开发人员环境还是构建服务器。
问题
可能会出现以下几个问题:
基于开发人员VM的本地构建可能会成功,但在Jenkins失败。
本地构建,Jenkins构建可能成功,但在另一个开发人员的VM上失败。
致
在开发人员.m2缓存中存在/丢失工件,在构建服务器的.m2缓存和/或archive
Artifactory存储库中缺少工件
提出的解决方案
运行[path_to_maven]mvn dependency:list
。[path_to_maven]
在项目的根文件夹中有自定义maven安装(带有空的.m2缓存)。还使用non-archived
配置了自定义maven以使用特殊的存储库(**all
** 存储库而没有 archive
**).**,输出如下所示:
它报告未解决的依赖项以及缺少它们的依赖构件。然而,该解决方案有两个主要缺点:
缺少的downloaded
运行mvn -B -q versions:set -DnewVersion=[some_version]
解决了第二个问题。无论如何,此命令在发布管道期间运行。
然而,尚不清楚如何解决第一个问题。
如何在使用.m2时找到未解析的maven依赖项,以便在每次推到特性分支之后在Jenkins构建过程中快速检测到未解决的依赖项?
pops的唯一想法是构建服务器上的.m2将与Artifactory同步。
开发人员机器上的.m2也可以使用某种使用rsync的自定义插件进行同步。有一个已知的插件可以做到这一点吗?
最终目标是删除archive
存储库,让构建失败。但是,首先,开发人员需要将依赖项与最新版本对齐。
root pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>multi-module-java-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>multi-module-java-app</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<pluginRepositories>
<pluginRepository>
<id>plugins</id>
<name>plugins</name>
<url>http://localhost:8081/artifactory/all</url>
</pluginRepository>
</pluginRepositories>
<repositories>
<repository>
<id>all</id>
<name>all</name>
<url>http://localhost:8081/artifactory/all</url>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>app1</module>
<module>app2</module>
</modules>
</project>
app 1 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>multi-module-java-app</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.mycompany.app.app1</groupId>
<artifactId>app1</artifactId>
<version>1.0-SNAPSHOT</version>
<name>app1</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<finalName>${artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</build>
<pluginRepositories>
<pluginRepository>
<id>plugins</id>
<name>plugins</name>
<url>http://localhost:8081/artifactory/all</url>
</pluginRepository>
</pluginRepositories>
<repositories>
<repository>
<id>all</id>
<name>all</name>
<url>http://localhost:8081/artifactory/all</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>spring-boot</artifactId>
<version>0.0.1-20200510.095344-1</version>
</dependency>
</dependencies>
</project>
app2 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>multi-module-java-app</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.mycompany.app.app2</groupId>
<artifactId>app2</artifactId>
<version>1.0-SNAPSHOT</version>
<name>app2</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<finalName>${artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</build>
<pluginRepositories>
<pluginRepository>
<id>plugins</id>
<name>plugins</name>
<url>http://localhost:8081/artifactory/all</url>
</pluginRepository>
</pluginRepositories>
<repositories>
<repository>
<id>all</id>
<name>all</name>
<url>http://localhost:8081/artifactory/all</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>spring-boot</artifactId>
<version>0.0.1-20200510.095344-1</version>
</dependency>
</dependencies>
</project>
发布于 2020-07-19 09:59:18
在开发人员的本地构建环境与Jenkins Slave
环境不同的情况下,我遇到了这个问题。在理想的世界中,开发人员需要将他们的本地环境与从属环境基线化,或者在开发的初始阶段完成后完全依赖于Jenkins
作业构建。
我赞赏您正在尝试提供.m2存储库的.m2特性,这是可行的,但增加了错误的范围和额外的常规维护任务,更不用说用户教育问题了。例如,如何确保.m2
是最新版本?就maven dependencies
而言,开发人员知道得最多,或者他们可能引入了slave
上还不存在的新依赖项。因此,我建议解决开发人员不对其依赖关系的根本问题,这与设计有关而不是自动化。
不确定是否想走这条路,但可能会帮助某人:
local machines
中对.m2
存储库的需求。如果开发人员的机器被清除或损坏,并且需要更新、审核和reconciliation.Jenkins slaves
中使用.m2
),则m2缓存会产生问题。这里的问题是,多个奴隶往往有不同的.m2
缓存内容,并从Artifactory来回同步,然后开发人员也将其同步到他们的本地听起来很复杂。没有人说所有这些.m2
在任何时候都是同步的,而且构建仍然可能与n-1
版本的版本一起执行。Artifactory
中的回购中,并积极维护它。使用setting.xml
特性提取标准依赖项。如果开发人员是通过Eclipse
或其他方式在其本地机器中构建的,则可以通过使用相同的xml
引用从IDE本身中提取依赖项,这样开发人员的xml
上就没有本地缓存--构建环境在local
和Jenkins Slave
之间有很小的区别--这导致.jar
大小相同或在大小的kilobytes
上略有不同。要识别jar文件之间的差异,请使用本文中列出的任何工具,它还可以帮助开发人员识别哪些依赖项本身不同步:Comparing two .jar files。
如果实现了此设计,包含依赖项的Artifactory存储库将成为依赖关系的唯一真实来源,您需要与开发人员合作,创建一个关于依赖项将如何更新和使用到这个单一的真理源的韵律。我希望这是有用的。
https://stackoverflow.com/questions/62912634
复制