如何在java中准确指定jar版本的依赖?

时间:2018-03-23 11:06:33

标签: java maven jar

当我的项目中使用的项目和jar没有使用相同的版本时,我遇到了问题。

下面是我项目中的pom.xml:

<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-core</artifactId>
    <version>1.6.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.another.project.server</groupId>
    <artifactId>exampleserver</artifactId>
    <version>1.0</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

我的exampleserver jar使用的是sshd-core版本0.14.0,但我的项目是使用sshd-core版本1.6.0。所以它会失败,因为sshd-core 0.14.0和sshd-core 1.6.0版本的所有实现都不同。

无论如何都要为exampleserver准确指定sshd版本吗?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

不幸的是,在编译/运行项目时,您只能拥有给定jar的一个版本。因此,您需要确定哪个版本的sshd-core version适用于项目中的所有用途(包括传递版本)。

如果您发现版本x.y.z非常适合您的项目和exampleserver,则可以通过<dependencyManagement>进行设置。如果此版本恰好是1.6.0,您还可以使用其他答案中描述的排除机制。

如果找不到适合所有用途的版本,您将会遇到困难。您可以尝试类着色,或者需要重写代码。

答案 1 :(得分:0)

exampleserver的sshd版本在exampleserver的POM中定义。如果这不是您的项目,则无法更改该版本。但是,你可以做的是从exampleserver中排除sshd依赖项,这样你的类路径上只有1.6.0版本。 E.g:

<dependency>
    <groupId>com.another.project.server</groupId>
    <artifactId>exampleserver</artifactId>
    <version>1.0</version>
    <type>jar</type>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.apache.sshd</groupId>
            <artifactId>sshd-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

答案 2 :(得分:0)

您可以使用排除。

  

由于maven 2.x可传递地解析依赖关系,因此可能会将不需要的依赖项包含在项目的类路径中。

https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html):

在你的例子中

<dependency>
    <groupId>com.another.project.server</groupId>
    <artifactId>exampleserver</artifactId>
    <version>1.0</version>
    <type>jar</type>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.apache.sshd</groupId>
            <artifactId>sshd-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>