【问题标题】:How to exclude a package from a dependency jar(using maven) present in a web project?如何从 Web 项目中存在的依赖项 jar(使用 maven)中排除包?
【发布时间】:2017-07-11 02:37:27
【问题描述】:

我的 pom.xml 中有以下依赖项。

<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-server-client</artifactId>
    <version>4.7.0-HBase-1.1</version>
</dependency>

以上是凤凰查询服务器交互 此依赖项具有 org.apache.calcite:calcite-avatica:1.6.0 传递依赖项。 calcite-avatica 依赖项具有 jackson-databind(2.1.1) 的传递依赖项之一。所以 jackson-databind(version: 2.1.1) 依赖项应该包含在我的项目的类路径中。但取而代之的是,jackson-databind(version: 2.1.1) 中的所有类都包含在 calcite-avatica jar 中。我已经在我的 pom.xml 中声明了 jackson-databind(版本:2.7.2)作为直接依赖项。 我可以通过标签排除 jackson-databind(2.1.1)。 .

但它并没有被排除在外,因为它已捆绑在 calcite-avatica:1.6.0 jar 中。有没有解决办法。我试过 Maven 阴影插件。但徒劳无功。

【问题讨论】:

    标签: java maven


    【解决方案1】:

    有不同的方法,没有一个是完美的:

    • 如果您不需要 calcite-avatica jar,请将其排除(使用 Maven 排除机制。
    • 如果您需要 calcite-avatica jar 中的一些类,但不需要 jackson-databind 类,请更改声明依赖项的顺序。因为 Java 只能加载每个类一次,所以 calcite-avatica jar 的类隐藏 jackson-databind 的类,反之亦然。
    • 创建一个不包含双倍类的“破解”方解石-avatica jar。
    • 如果您真的非常需要两个不同版本的 jackson-databind,您需要尝试使用 shade 插件构建它,但这并不容易。

    【讨论】:

    • 我创建了一个破解的方解石-avatica jar。 @JF Meier我需要知道在哪种情况下将 pom.xml 中声明的依赖 jar 的类添加到最终 jar 中。例如,(虽然我已经提到但改写)calcite-avatica 在其 pom.xml 中声明了 jackson-databind 的依赖关系,但不是下载 jackaon-databind jar,而是将类放在 calcite activa jar 中?
    • 我需要在我的项目中包含 calcite-avatica jar。我只需要一个版本的jackson-databind jar
    • 有些人使用 maven-shade-plugin 将所有依赖项集成到他们的 jar 中 - 这会导致像您上面遇到的问题。通常的方法是这样做。
    • 对不起,我通常不会将我的电子邮件地址提供给陌生人。你想讨论什么不能在这里讨论?
    • 对不起,我不做私人帮助会议。如果您有任何问题,请在 stackoverflow 上提问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2011-12-15
    • 2016-04-29
    • 2020-04-19
    • 2015-09-23
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多