社区首页 >问答首页 >在多模块maven项目中查找未解析的maven依赖项

在多模块maven项目中查找未解析的maven依赖项
EN

Stack Overflow用户
提问于 2020-07-15 02:16:21
回答 1查看 1.4K关注 0票数 4

我希望maven在具有以下结构的多模块maven Java项目中报告未解决的依赖关系:

代码语言:javascript
代码运行次数:0
复制
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

  • unresolved

  • .m2显著降低了检测速度,因为所有依赖项都必须是工件或模块,而缺少它们的总是快照。

运行mvn -B -q versions:set -DnewVersion=[some_version]解决了第二个问题。无论如何,此命令在发布管道期间运行。

然而,尚不清楚如何解决第一个问题。

如何在使用.m2时找到未解析的maven依赖项,以便在每次推到特性分支之后在Jenkins构建过程中快速检测到未解决的依赖项?

pops的唯一想法是构建服务器上的.m2将与Artifactory同步。

开发人员机器上的.m2也可以使用某种使用rsync的自定义插件进行同步。有一个已知的插件可以做到这一点吗?

最终目标是删除archive存储库,让构建失败。但是,首先,开发人员需要将依赖项与最新版本对齐。

root pom.xml

代码语言:javascript
代码运行次数:0
复制
<?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:

代码语言:javascript
代码运行次数:0
复制
<?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:

代码语言:javascript
代码运行次数:0
复制
<?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>
EN

回答 1

Stack Overflow用户

发布于 2020-07-19 09:59:18

在开发人员的本地构建环境与Jenkins Slave环境不同的情况下,我遇到了这个问题。在理想的世界中,开发人员需要将他们的本地环境与从属环境基线化,或者在开发的初始阶段完成后完全依赖于Jenkins作业构建。

我赞赏您正在尝试提供.m2存储库的.m2特性,这是可行的,但增加了错误的范围和额外的常规维护任务,更不用说用户教育问题了。例如,如何确保.m2是最新版本?就maven dependencies而言,开发人员知道得最多,或者他们可能引入了slave上还不存在的新依赖项。因此,我建议解决开发人员不对其依赖关系的根本问题,这与设计有关而不是自动化。

不确定是否想走这条路,但可能会帮助某人:

  1. 消除了开发人员local machines中对.m2存储库的需求。如果开发人员的机器被清除或损坏,并且需要更新、审核和reconciliation.
  2. Eliminate (需要在Jenkins slaves中使用.m2 ),则m2缓存会产生问题。这里的问题是,多个奴隶往往有不同的.m2缓存内容,并从Artifactory来回同步,然后开发人员也将其同步到他们的本地听起来很复杂。没有人说所有这些.m2在任何时候都是同步的,而且构建仍然可能与n-1版本的版本一起执行。
  3. 既然没有.m2,我们仍然需要一个地方供开发人员使用。将所有依赖项推到Artifactory中的回购中,并积极维护它。使用setting.xml特性提取标准依赖项。如果开发人员是通过Eclipse或其他方式在其本地机器中构建的,则可以通过使用相同的xml引用从IDE本身中提取依赖项,这样开发人员的xml上就没有本地缓存--构建环境在localJenkins Slave之间有很小的区别--这导致.jar大小相同或在大小的kilobytes上略有不同。

要识别jar文件之间的差异,请使用本文中列出的任何工具,它还可以帮助开发人员识别哪些依赖项本身不同步:Comparing two .jar files

如果实现了此设计,包含依赖项的Artifactory存储库将成为依赖关系的唯一真实来源,您需要与开发人员合作,创建一个关于依赖项将如何更新和使用到这个单一的真理源的韵律。我希望这是有用的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62912634

复制
相关文章
javascript将html实体转回
有时候我们可能需要向html中传递html代码。但是因为我们的后台框架使用了laravel。所以我们在赋值的时候就会变成:
魔王卷子
2019/05/31
9780
短实体,长句实体抽取
“半指针-半标注”方法实体的抽取器,基于苏神的三元组抽取方法改造,这里取消了三元组抽取模型中对s的抽取,直接抽取实体并做分类(相当于直接抽取p和o)。改造后的实体抽取方法不仅可以运用于短实体的抽取,也可以运用到长句实体的抽取。
机器学习AI算法工程
2020/09/14
1.9K0
EF实体中的修改
思路:先从ObjectContext取出实体,然后将前台传过来的DTO属性对应赋值到我们的实体上,然后调用ObjectContext的保证修改方法。
跟着阿笨一起玩NET
2018/09/19
1.1K0
springboot 根据实体类生成数据库中表BaseEntity(公共实体)配置文件application.yml 子类实体:
1.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
用户5899361
2020/12/07
5K0
SpringBoot 使用注解将配置文件自动映射到属性和实体类
1. 属性单独映射 ---- 1. Controller上面配置 @PropertySource({"classpath:application.properties"}) 2. 对要配置的属性添加注解 @Value("${web.file.path}") private String filePath; 3. 接口测试 @GetMapping("/test/property-source") public Object testPropertySource() { System.out.print
山海散人
2021/03/03
1.3K0
nginx设置header如果没有值
map 指令是由 ngx_http_map_module 模块提供的,默认情况下安装 nginx 都会安装该模块。
十毛
2022/08/23
1.4K0
nginx设置header如果没有值
[NewLife.XCode]实体工厂(拦截处理实体操作)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。
大石头
2019/07/02
1K0
实体识别(1) -实体识别任务简介
命名实体识别(Named Entity Recognition,简称NER) , 是指识别文本中具有特定意义的词(实体),主要包括人名、地名、机构名、专有名词等等,并把我们需要识别的词在文本序列中标注出来。
致Great
2023/08/25
4910
实体识别(1) -实体识别任务简介
Apple Card实体卡曝光,只有logo没有卡号
在今年3月的春季发布会上,苹果在Apple Pay的基础上推出了信用卡“Apple Card”,就在近日,国外知名数码产品爆料者Ben Geskin在推特上展示了苹果实体信用卡的真面目,从图片上可以看出这款信用卡的设计非常简约,卡面上除了logo就是EMV芯片。
镁客网
2019/05/16
7900
JS魔法堂:再识ASCII实体、符号实体和字符实体
一、前言                                            相信大家都熟悉通过字符实体 &nbsp; 来实现多个连续空格的输入吧!本文打算对三类HTML实体及JS相关操作作进一步的整理和小结,若有纰漏请大家指正,谢谢。 二、初识HTML实体                                                                    由于HTML中某些字符是预留的(如>和<等),若要在进行HTML解析出来后能正确显示预留字符,则需要
^_^肥仔John
2018/01/18
2.2K0
实体-联系图(ER图)_实体关系图
我们通常用实体、联系和属性这三个概念来理解现实问题,因此ER模型比较接近人的思维方式。此外,ER模型用简单的图形符号表达系统分析员对问题域的理解,不熟悉计算机技术的用户也能理解它,因此,ER模型可以作为用户与分析员之间有效的交流工具。
全栈程序员站长
2022/09/29
2.3K0
实体-联系图(ER图)_实体关系图
python实现命名实体识别指标(实体级别)
{'ALBUM': [(18, 3)], 'SINGER': [(11, 3)], 'SONG': [(2, 3), (6, 3)], 'TAG': [(23, 3)]}
西西嘛呦
2020/11/12
1.3K0
将实体光盘制作成光盘映像iso文件
春节假期整理历史物件时发现一些书籍的光盘,虽然买了多年但一直没有看过,因为自己在用的电脑都没有光驱。正好老爸的电脑是带光驱的,想着趁过节把这些光盘的内容读取出来存在NAS上方便后续使用。 使用UltraISO软件直接“制作光盘映像文件”就可以将光盘的内容制作成iso文件,便于保存在磁盘等介质上。基本最长的也就是10分钟左右搞定。
Alfred Zhao
2023/02/10
2K0
HTML 字符实体
在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。
用户8442333
2021/08/21
1.7K0
HTML字符实体
刚刚在修改文件的时候,空格怎么都打不上,后来反应过来得使用html字符实体,为了方便自己查找,便有了这篇文章
用砖头敲代码
2022/06/08
1.4K0
组合实体模式
组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。
Java架构师必看
2020/04/13
4980
JPA实体类中的注解
@Entity   标注于实体类上,通常和@Table是结合使用的,代表是该类是实体类 @Table   标注于实体类上,表示该类映射到数据库中的表,没有指定名称的话就表示与数据库中表名为该类的简单类名的表名相对应,如果是逆向生成表的话就会以简单类名作为表名   如果指定名称,例如@Table(name="tb_user"),就表示映射到数据库中的tb_userz这个表; @Id   标注于属性上,通常是在get方法上,也可以在属性的声明上。   用于表示该属性作为ID主键 @GeneratedValue
二十三年蝉
2018/03/29
3.9K0
EntityFramework附加实体
//0.0创建修改的 实体对象 Models.BlogArticle model = new BlogArticle(); model.AId = 12; model.ATitle = "新的数据"; model.AContent = "新的数据~~~~~"; //0.1添加到EF管理容器中,并获取 实体对象 的伪包装类对象 DbEntityEntry<Models.BlogArticle> entry = db.Entry<Models.BlogArticle>(model); //**如果使用 En
liulun
2018/01/12
7570
实体识别(2) -命名实体识别实践CRF
CRF,英文全称为Conditional Random Field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场。
致Great
2022/03/30
1.7K0
实体识别(2) -命名实体识别实践CRF
选择块参照中嵌套的实体
在利用ObjectARX进行CAD二次开发时,如何选择块参照中嵌套的实体,并进行进行下一步操作?这个问题的难点是:如何判断用户选中的实体到底是块参照里面的非嵌套对象实体?还是块参照中嵌套的块参照的实体?本文利用全局函数acedNEnsSelP解决了这个问题,并可实现:如果用户选择块参照中嵌套的实体,直接视为用户选择了这个嵌套的块参照,效果如图。
用户3519280
2023/07/31
2651

相似问题

无法用python连接到Server

12

用python中的connectorx连接MS SQL Server

216

无法用python连接到Azure Server

20

SQL Server SELECT with READONLY子句

40

用Streamlit编写连接python和Server的函数?

218
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档