Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Maven对任意版本选择发出警告?_Maven_Dependency Management - Fatal编程技术网

如何使Maven对任意版本选择发出警告?

如何使Maven对任意版本选择发出警告?,maven,dependency-management,Maven,Dependency Management,在一个Maven项目中,我们使用了一个第三方工件(具体地说,SpringDataJPA1.1.0.RELEASE),它依赖于另一个工件(SpringCore),允许范围内的任何版本(准确地说:[3.0.7.RELEASE,4.0.0.RELEASE),请参见)。我们对SpringCore没有直接依赖 所以有一天我们的构建选择了3.1.2.RELEASE,但是当3.2.0.RC1发布时,我们的构建突然选择了这个版本 然而,我们希望有可重复的构建:当我们在一年后发布补丁时,我们不希望在不知道的情况下

在一个Maven项目中,我们使用了一个第三方工件(具体地说,SpringDataJPA1.1.0.RELEASE),它依赖于另一个工件(SpringCore),允许范围内的任何版本(准确地说:[3.0.7.RELEASE,4.0.0.RELEASE),请参见)。我们对SpringCore没有直接依赖

所以有一天我们的构建选择了3.1.2.RELEASE,但是当3.2.0.RC1发布时,我们的构建突然选择了这个版本

然而,我们希望有可重复的构建:当我们在一年后发布补丁时,我们不希望在不知道的情况下引入SpringCore的更新版本或任何其他间接依赖

(我知道我们可以指导Maven为spring core选择一个特定的版本,例如使用
,但我的观点是,间接依赖项中可能隐藏着任意选择,我希望Maven告诉我们这些,而不必定期手动检查。)


问:如果Maven对任何间接依赖项进行任意版本选择,我们如何让它警告我们?

正如您所发现的,版本范围是邪恶的

真正的问题是,版本范围是一种诱惑,诱使人们认为他们是一个好主意

一个版本范围实际上应该被看作是对开发人员的一个提示,允许开发人员从一组版本中选择他们想要的版本

Maven中的错误首先是允许在
pom.xml
中定义版本范围,因为这允许人们发布包含版本范围的工件

一旦您对具有使用版本范围的可传递依赖项的工件有了依赖项,实际上只有两种方法可以解决您的构建问题(其中一种只是第二种版本的更高级版本)

  • 在可传递依赖项上添加您自己的依赖项,但在范围中添加固定版本…例如

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
      <version>1.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.1.2.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
    
    org.springframework.data
    spring数据jpa
    1.1.0.1发布
    org.springframework
    春季甲虫
    3.1.2.1发布
    org.springframework
    德克萨斯州春季
    3.1.2.1发布
    org.springframework
    春豆
    3.1.2.1发布
    org.springframework
    弹簧芯
    3.1.2.1发布
    公用记录
    公用记录
    
    您不需要列出
    true
    依赖项,因为它们是不可传递的,同样,您也不需要出于同样的原因列出
    提供的
    依赖项

  • 对于上述情况,但首先要为依赖项添加排除,以确保安全,例如

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
      <version>1.1.0.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.1.2.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
    
    org.springframework.data
    spring数据jpa
    1.1.0.1发布
    org.springframework
    春季甲虫
    org.springframework
    德克萨斯州春季
    org.springframework
    春豆
    org.springframework
    弹簧芯
    org.springframework
    春季甲虫
    3.1.2.1发布
    org.springframework
    德克萨斯州春季
    3.1.2.1发布
    org.springframework
    春豆
    3.1.2.1发布
    org.springframework
    弹簧芯
    3.1.2.1发布
    公用记录
    公用记录
    
  • 在这两种方法中,我更喜欢后者,因为它至少给了人们一个提示,说明为什么要明确提到这些依赖关系

    因此,要回到原来的问题,关键是当您在
    pom.xml
    中添加或更新依赖项时,需要设置此依赖项树

    如果
    spring数据jpa:1.1.1.RELEASE
    有一个具有不同坐标的完全不同的传递依赖关系树,那么在编辑
    pom.xml
    以更新版本时,您也应该修复传递关系

    据我所知,目前没有任何实施者规则支持验证您的要求

    我建议编写一个执行者规则,我称之为:
    ensureTransitiveVersionRangesAppined

    该规则应做到以下几点:

    • 扫描项目依赖项列表
    • 计算每个项目依赖项提供的可传递依赖项
    • 如果这些可传递依赖项中的任何一个是版本范围,那么
      • 验证该可传递依赖项是否存在
        排除
      • 验证是否存在可传递依赖项的固定版本作为直接项目依赖项(如果没有固定版本,则可能不会失败,因为您可能正在添加位于不同GAV的等效工件,或者您可能不需要该依赖项)…在任何情况下,如果没有重新添加依赖项,则单元测试很可能会触发CNFE来捕获该依赖项,因此该检查可能不是严格要求的,但它可能会打印一条警告

    我想不起是否有工具来检查
    是否确实排除了任何可传递的依赖项,因此您可能需要对此进行调查。

    可能重复的事实上,它不是重复的。我很抱歉。它只是相关的。这将是enforcer插件的一个好规则。@Stephennolly:谢谢指向此的指针插件,很快太长了,读不下去了。这是一个新的规则吗?“MalnxkCurster我认为这是一个新的规则。依赖性收敛规则仅仅保证两个依赖关系不传递相同的伪影的不同版本。TL;DR,但是前两个句子的+1。