Maven和依赖于两个不同版本的库

时间:2014-03-12 17:25:50

标签: maven maven-3 dependency-management

我正在使用maven 3.1.1,我有以下问题

我有一个主项目(pom.xml),它将被编译为WAR文件。它有两个模块。

<module>module1</module>
<module>module2</module>

...

<dependency>
   <groupId>com.foo</groupId>
   <artifactId>module1</artifactId>
   <version><1.0/version>
</dependency>
<dependency>
   <groupId>com.foo</groupId>
   <artifactId>module2</artifactId>
   <version>1.0</version>
</dependency>

第1单元有以下内容(请注意工件版本)

<dependency>
   <groupId>com.bar</groupId>
   <artifactId>library</artifactId>
   <version>1</version>
</dependency>

第2单元有以下内容(请注意工件版本)

<dependency>
   <groupId>com.bar</groupId>
   <artifactId>library</artifactId>
   <version>2</version>
</dependency>

因此,我的项目取决于同一个库的两个版本。问题是库版本2与版本1不向后兼容。因此,我不能只包含版本2.

我正在考虑修改模块1以使用库版本2,但这需要花费大量时间。所以,我正在寻找一种方法来包含两个版本的库。

我如何确保:

  • 两个版本的库都会以WAR文件结尾? (我觉得Maven不会在/ WEB-INF / lib下放置同一个库的两个不同版本。所以,如何打包它,所以这两个版本最终都会出现在war文件中)
  • 模块1使用版本为1的库
  • 模块2使用版本为2的库

更新1(关于可选和排除的想法)

我读到有关可选项和排除依赖项here的内容。我不确定它会起作用。

  • 排除

基于文档

  

排除项是针对POM中的特定依赖项设置的,并且针对特定的groupId和artifactId。在构建项目时,该工件不会通过声明排除的依赖项添加到项目的类路径中。

我相信如果我尝试在我的主项目中排除库v2,它就不会被包含在内。主项目将构建模块2。但是,当它将所有内容(包括module2)打包到WAR文件时,它只会排除库V2。

  • 可选

基于文档If a user wants to use functionality related to an optional dependency, they will have to redeclare that optional dependency in their own project.

所以,如果我将在我的module2中声明对库v2的依赖可选,那么如果我不在主项目中重新声明它,它将不会包含在最终的WAR文件中。

1 个答案:

答案 0 :(得分:0)

您的模块应该正常声明对您的Ja2的依赖。

如果您指定项目依赖于您的模块,请使用

<exclusions>

标记将jar版本2排除为&#39;导出&#39;作为传递依赖。

        <dependency>
            <groupId>yourGroup</groupId>
            <artifactId>yourJar</artifactId>
            <version>1</version>
        </dependency>
        So your project has a dependency on Jar1
         <dependency>
            <groupId>yourGroup</groupId>
            <artifactId>yourModule</artifactId>
            <version>1</version>
            <optional>true</optional>
            <exclusions>
                <exclusion>
                    <groupId>yourGroup</groupId>
                    <artifactId>yourJar</artifactId>
                    <version>2</version>
                </exclusion>
            </exclusions>
        </dependency>
        And now your project has a dependency on yourModule, which will not give you a transitive dependency on yourJar2
相关问题