Maven:添加相同工件的旧版本作为依赖项

时间:2015-12-13 01:08:54

标签: java maven maven-3 pom.xml

是否可以将相同工件的旧版本添加为依赖项? 这是一个例子:

<groupId>edu.illinois.cs.cogcomp</groupId>
<artifactId>illinois-pos</artifactId>
<version>2.0.3</version>

<dependencies>
    <dependency>
        <groupId>edu.illinois.cs.cogcomp</groupId>
        <artifactId>illinois-pos</artifactId>
        <version>2.0.2</version>
        <classifier>model</classifier>
    </dependency>
</dependencies>

如果没有,有什么办法让它起作用吗?

2 个答案:

答案 0 :(得分:1)

根据您的意见(以及进一步的澄清和需求),我建议将Maven multi-module项目结构如下:

  • 使用最新依赖项提供代码的模块,该模块不提供任何测试
  • 一个模块,仅提供测试用例并使用旧的依赖关系,因此通过使用另一个依赖关系来运行相关代码的测试。为了使它工作,测试模块必须依赖于代码模块,并显式重新声明您实际需要的依赖版本。

因此,您将拥有一个具有packaging pom的聚合器pom(空项目,无源,无测试)并定义两个模块(即代码模块,测试模块)。您将继续处理代码模块,然后在测试模块上提供测试用例,您还可以覆盖并重新定义任何所需的依赖项。

因此,作为同一构建的一部分(在聚合器项目上),您可以根据需要构建两个模块。

或者,保留单层模块,您可以定义profile,它将重新定义所需的依赖项(使用不同的版本)并运行您的测试用例。这也意味着:

  • 作为默认构建的一部分,您需要跳过测试,通过属性(即<skip>${skip.tests}</skip>)将Maven Surefire插件配置为skip tests,该属性具有默认值true
  • 然后,您需要配置您的配置文件,以将skip.tests属性的值更改为false并重新定义依赖关系

使用第二种方法,您需要执行两次构建:第一次构建将正常运行但跳过测试(mvn clean install),第二次构建将激活配置文件并从测试阶段开始({{ 1}})。

第一种方法(多模块项目)肯定更值得推荐。

答案 1 :(得分:0)

不,不是,因为maven会选择更高版本。那是因为在运行时,java不能同时使用这两个版本 - 如果你在类路径中同时使用这两个版本,那么加载的第一个版本将会&#34; win&#34;而另一个则不会被使用。