我正在使用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,但这需要大量时间。因此,我正在寻找一种方法来包含库的两个版本。
我如何确保:
更新1(关于可选和排除的想法)
我在这里读到了关于可选和排除依赖项的内容。我不确定它是否会起作用。
根据文件
排除是针对POM中的特定依赖项设置的,并且针对特定的groupId和artifactId。在构建项目时,不会通过声明排除的依赖项将该工件添加到项目的类路径中。
我相信,如果我试图在我的主要项目中排除library v2,它就不会被包括在内。主要项目将建造模块2。然而,当它将所有内容(包括module2)打包到WAR文件时,它只会排除library V2。
根据文档如果用户想要使用与可选依赖项相关的功能,他们必须在自己的项目中重新声明该可选依赖项
所以,如果我在module2依赖库v2中声明为可选,那么如果我不在主项目中重新声明它,它就不会包含在最终的WAR文件中。
您的模块应该像往常一样声明对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视为可传递依赖项,并选择较旧的版本。现在,当我调用库中的某些方法时,我会得到类或方法