Java 排除并重新导入具有不同版本的Maven依赖项

Java 排除并重新导入具有不同版本的Maven依赖项,java,maven,Java,Maven,这个例子是一个基于现实问题的假设场景。考虑一个从POM.XML文件中获取的块,如下所示。在这个场景中,我想从artifact-a中排除artifact-b依赖项,并用不同的版本重新导入它。显然,排除的工件-b版本不等于${product2.version} <dependency> <groupId>com.company.product1</groupId> <artifactId>artifact-a</artifactI

这个例子是一个基于现实问题的假设场景。考虑一个从POM.XML文件中获取的块,如下所示。在这个场景中,我想从artifact-a中排除artifact-b依赖项,并用不同的版本重新导入它。显然,排除的工件-b版本不等于
${product2.version}

<dependency>
    <groupId>com.company.product1</groupId>
    <artifactId>artifact-a</artifactId>
    <version>${product1.version}</version>
    <exclusions>
        <exclusion>
            <groupId>com.company.product2</groupId>
            <artifactId>artifact-b</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.company.product2</groupId>
    <artifactId>artifact-b</artifactId>
    <version>${product2.version}</version>
</dependency>

com.company.product1
人工制品
${product1.version}
com.company.product2
伪影-b
com.company.product2
伪影-b
${product2.version}
因此,当为最终应用程序执行
mvn install
命令时,我将只在应用程序存储从其依赖项收集的jar的文件夹下具有
${product2.version}
artifact-b


这是我的模块的预期行为,但这是否也意味着artifact-ajar中的方法现在将使用
${product2.version}
调用artifact-bjar?如果是这样(这是我所期望的,因为目标存储库不包括排除的版本),那么如果artifact-b中调用的方法在新版本中不同,会发生什么情况?它只是检查方法签名,还是有其他因素会导致编译/运行时错误?

首先,正如khmarbaise所说,排除是不必要的

其次,增加库版本可能会导致各种问题。编译时问题主要是方法签名或缺少类,但在运行时,任何事情都可能发生,这取决于对库的源代码所做的更改


您可以希望库的维护人员尝试使所有内容向后兼容。

第一个错误的假设:您的
目标
目录中没有任何工件,只有pom项目的结果jar,它使用
工件-a
工件-b
作为依赖项。此外,在这种情况下不需要排除,因为您的项目距离较远,
artifact-b
将决定您将
artifact-b
用于版本
product2.version
…有一个可执行模块,它收集所有依赖项并创建一个可运行的项目。我将修正我问题中的这一部分。这会改变什么吗?如何收集依赖项?在更新之前,我跳过了详细信息,只是写下了模块使用的所有jar文件在install命令后都将位于目标文件夹下。实际上,模块本身只在目标文件夹中,应用程序使用的所有jar文件都在实际应用程序的lib文件夹下。您还没有回答我的问题。您是通过哪个插件/工具实现这一点的?但这听起来像是maven组装插件的工作…谢谢你的回答。我有一个案例,当我删除排除时会引起问题,但这是一个非常大的项目,我无法分享。尽管如此,我认为在大多数情况下,排除是不必要的,但不能保证。第二,我非常清楚,增加库版本不是一个好的做法,可能会导致问题,但我暂时束手无策,我所能做的就是确保应用程序正常工作。在您的情况下,排除总是不必要的。您可以通过运行
mvn dependency:list
(有排除和没有排除)轻松检查这一点,您将得到完全相同的结果。我并不是说您不应该增加库版本,但您需要彻底测试是否有任何损坏。