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 。
然而,这个解决方案有两个主要缺点:
  • .m2 缺失会显着减慢检测速度,因为必须下载所有依赖项
  • 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 执行构建它的版本。
  • 现在没有 .m2 ,我们仍然需要一个地方让开发人员从中提取依赖项。将所有依赖项推送到 Artifactory 中的仓库并积极维护。使用 setting.xml提取标准依赖项的功能。如果开发人员在他的本地机器上构建,通过 Eclipse或者其他,可以使用相同的 xml 从 IDE 本身中提取依赖项。引用,因此开发人员的机器上没有维护本地缓存。
  • 当构建环境与 local 有细微差别时和 Jenkins Slave这会导致 .jar kilobytes 中的大小相同或略有不同的大小。

  • 要识别 jar 文件之间的这种差异,请使用本文中列出的任何工具,它还可以帮助开发人员自行识别哪些依赖项不同步:
    Comparing two .jar files
    如果实现了这种设计,则包含依赖项的 Artifactory 存储库将成为依赖项的单一事实来源,您需要与开发人员一起创建一个节奏,以了解如何在这个单一事实来源中更新和使用依赖项。我希望这很有用。


    标签:Maven
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号