当前位置: 首页 > 知识库问答 >
问题:

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

董法
2023-03-14

我正在使用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(关于可选和排除的想法)

我在这里读到了关于可选和排除依赖项的内容。我不确定它是否会起作用。

  • 排除

根据文件

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

我相信,如果我试图在我的主要项目中排除library v2,它就不会被包括在内。主要项目将建造模块2。然而,当它将所有内容(包括module2)打包到WAR文件时,它只会排除library V2。

  • 可选

根据文档如果用户想要使用与可选依赖项相关的功能,他们必须在自己的项目中重新声明该可选依赖项

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


共有1个答案

陆运乾
2023-03-14

您的模块应该像往常一样声明对JAR2的依赖关系。

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

<exclusions>

将jar版本2作为可传递依赖项“导出”排除在外的标记。

        <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
 类似资料:
  • 问题内容: 我有一个独立使用两个依赖项的项目:BoneCP和Hibernate。但是由于SLF4J及其版本冲突,它无法正常工作,因为BoneCP需要SLF4J 1.5,而Hibernate需要SLF4j 1.6。如您所知,在pom.xml中不可能同时具有相同依赖项的两个不同版本。所以,我该怎么办才能解决这种惊人的SLF4J副作用??? 我得到的错误是臭名昭著的: 我需要添加它,但是不允许具有两个不

  • Maven插件(maven-compiler-plugin: 3.8.1和maven-surefire-plugin: 3.0.0-M3)在运行mvn清洁包时似乎正在下载同一依赖项(plexus-utils)的多个版本,即使我在依赖项中指定了plexus-utils的最新版本。这不会导致任何错误,但3.0.16之前的任何版本的plexus-utils都容易受到命令注入的影响。有没有办法阻止这种情况

  • 我有一个包含两个maven模块(moduleA和moduleB)的java项目,其中每个模块都希望访问同一库的不同版本(v1和v2)。moduleA使用moduleB作为依赖项。我创建moduleB主要是为了解决这个问题,同时也认为它将保持代码的良好组织。 我在moduleA的pom.xml中使用了maven shade插件,认为它将帮助我区分每个版本的类,但我仍然得到“NoSuchMethodE

  • 问题内容: 我正在为Java中的ERP系统进行定制。在我的定制中,我想使用Apache POI 3.10.1。因此,我集成了jars poi-3.10.1-20140818.jar和poi-ooxml-3.10.1-20140818.jar。 但是,这些jar包含几个类,这些类已经包含在ERP系统的核心代码中,但是有所不同。 如果核心ERP类覆盖POI类,则定制将引发运行时异常。如果POI类覆盖核

  • 问题内容: 我刚刚遇到了一个案例,即我的Maven项目有两个直接依赖项,其中有两个不同版本的特定传递性依赖项。 在我的特殊情况下,我直接依赖以下内容: 和 这两个依赖项都对com.sun.jersey:jersey- core具有(较深)的传递性依赖关系,但是每个都有不同的版本。Maven并没有失败,甚至没有警告(或者,如果没有,我从来没有看到过!)正在发生这样的事情……因此,直到调试了球衣版本时

  • 我写了一个库,它依赖于Guava版本20.0(与JDK 1.7兼容的最后一个版本) 然后,我编写了一个使用该库的应用程序,还uk.org.lidalia: slf4j-test: 1.2.0(带有测试范围)。slf4j-test依赖于Guava的14.0.1版本。 我的问题是,我的应用程序将两个不同版本的Guava视为可传递依赖项,并选择较旧的版本。现在,当我调用库中的某些方法时,我会得到类或方法