java之在多模块maven项目中查找 Unresolved maven依赖项
程序猿
阅读:20
2024-11-24 20:56:43
评论:0
我希望 maven 在具有以下结构的多模块 maven Java 项目中报告 Unresolved 依赖项:
multi-module-java-app/
├── app1
│ ├── pom.xml
│ └── src
├── app2
│ ├── pom.xml
│ └── src
└── pom.xml
poms在底部。
背景:
Maven 被用作依赖管理和构建工具。 Artifactory 是存储库管理器。 Artifact 可以在开发人员的环境或 Jenkins 构建服务器上使用本地 maven 构建。 Artifactory 会定期将 Artifact 移至特殊位置
archive
存储库,它是 all
的一部分存储库虚拟。
Maven 将本地构建的 Artifact 缓存在运行 Maven 的计算机上的 ~/.m2 目录中,无论是开发环境还是构建服务器。
问题
可能会出现几个问题:
开发人员虚拟机上的本地构建可能会成功,但在 Jenkins 中会失败。
本地构建,Jenkins 构建可能会成功,但在另一个开发人员的 VM 上会失败。
原因
开发人员 .m2 缓存中存在/缺失的 Artifact ,构建服务器的 .m2 缓存和/或
archive
中缺失的 Artifact Artifact 存储库
建议的解决方案
运行
[path_to_maven]mvn dependency:list
.
[path_to_maven]
在项目的根文件夹中有自定义 maven 安装(带有空的 .m2 缓存)。
自定义 maven 也使用 settings.xml 配置为使用特殊的 non-archived
存储库( all
没有 archive
的存储库)。
输出如下:
它报告 Unresolved 依赖关系以及遗漏它们的依赖 Artifact 。
然而,这个解决方案有两个主要缺点:
运行
mvn -B -q versions:set -DnewVersion=[some_version]
解决第二个。无论如何,此命令在发布管道期间运行。
但是,尚不清楚如何解决第一个问题。
如何在使用 .m2 时找到 Unresolved maven 依赖项,以便在每次推送到功能分支后在 Jenkins 构建期间快速检测到 Unresolved 依赖项?
唯一的想法是构建服务器上的 .m2 将与 Artifactory 同步。
开发人员机器上的 .m2 也可以使用某种使用 rsync 的自定义插件进行同步。是否有一个已知的插件可以做到这一点?
最终目标是删除
archive
存储库并让构建失败。但是,首先开发人员需要将依赖项与最新版本对齐。
根 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>
应用程序 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>
请您参考如下方法:
我遇到了这个确切的问题,开发人员的本地构建环境与 Jenkins Slave
不同。环境。在理想情况下,开发人员需要将本地环境与从属环境作为基准,或者完全依赖 Jenkins
。一旦开发的初始阶段完成,工作就会建立。
感谢您尝试提供 automated sync
.m2 存储库的功能,它是可行的,但增加了错误和额外的日常维护任务的范围,更不用说用户教育问题了。例如,您将如何确保 .m2
是最新版本吗?在 maven dependencies
方面,开发人员最清楚,或者他们可能会引入 slave
上不存在的新依赖项。然而。因此,我建议修复 的根本问题。开发人员没有调整他们的依赖关系这比自动化更与设计相关。
不确定您是否想走这条路,但可能会帮助某人:
.m2
的需求local machines
中的存储库的开发商。如果开发人员的机器被毁坏或损坏,m2 缓存会产生问题,并且需要更新、审计和协调。 .m2
的需求在 Jenkins slaves
.这里的问题是,多个奴隶往往有不同的.m2
缓存内容并从 Artifactory 来回同步,然后开发人员还将其同步到他们的本地声音很复杂。没有说所有这些.m2
将在任何时间点同步,并且仍然可以使用 n-1
执行构建它的版本。 Artifactory
中的仓库并积极维护。使用 setting.xml
提取标准依赖项的功能。如果开发人员在他的本地机器上构建,通过 Eclipse
或者其他,可以使用相同的 xml
从 IDE 本身中提取依赖项。引用,因此开发人员的机器上没有维护本地缓存。 local
有细微差别时和 Jenkins Slave
这会导致 .jar
kilobytes
中的大小相同或略有不同的大小。 要识别 jar 文件之间的这种差异,请使用本文中列出的任何工具,它还可以帮助开发人员自行识别哪些依赖项不同步:
Comparing two .jar files
如果实现了这种设计,则包含依赖项的 Artifactory 存储库将成为依赖项的单一事实来源,您需要与开发人员一起创建一个节奏,以了解如何在这个单一事实来源中更新和使用依赖项。我希望这很有用。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。