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

排除maven中的依赖性

严斌
2023-03-14

我在我的项目中遇到了依赖关系冲突的问题。特别是,slf4j日志记录有两种实现:slf4j-简单和logback-经典,我得到了

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/apykhtin/.m2/repository/org/slf4j/slf4j-simple/1.7.19/slf4j-simple-1.7.19.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/apykhtin/.m2/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
Exception in thread "main" java.lang.IllegalStateException: Unable to acquire the logger context
        at io.dropwizard.logging.LoggingUtil.getLoggerContext(LoggingUtil.java:46)

在运行时。

logback-classic对我来说是必备的依赖项(因为dropwizard),但slf4j-simple不是真的,我想把它从我的uber项目中去掉。只是没那么容易。

我的“uber jar”依赖于“small jar”,而“small-jar”又依赖于“slf4j simple”。在uber jar的pom中加入一个排除是没有帮助的:

<dependency>
    <groupId>com.my.unique.group</groupId>
    <artifactId>small-jar</artifactId>
    <version>0.1.2-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
        </exclusion>
    </exclusions>
</dependency>

我想是因为小罐子有阴影。我的“uber jar”使用的是maven shade插件,而“小jar”则不是。我还尝试从阴影中排除slf4j simple:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.6</version>
    <configuration>
    <artifactSet>
        <excludes>
            <exclude>org.slf4j:slf4j-simple:jar</exclude>
        </excludes>
    </artifactSet>
    ...
</plugin>

但是也没有成功。slf4j-simple仍然包含在我的超级jar中。到目前为止,我的发展都与“超级罐子”有关。对我来说,修改“小罐子”代码是可能的,但是我想避免这样做。

我做错了什么?

共有2个答案

羊舌诚
2023-03-14

为什么小罐子被阴影化了?在将小罐子编译为非阴影工件时,似乎可以让maven处理slf4j的传递依赖项,然后当您在“uber-jar”中依赖小罐子时,排除必要的传递依赖项(也就是slf4j)。一旦它被阴影化,maven将无法排除依赖项,因为据它所知,小罐子中的所有内容都是单个依赖项。

我知道您希望避免对小jar进行更改,但这通常是着色的固有问题之一。我建议不要对小jar进行着色,或者至少将slf4j从小jar着色中排除,并让maven将其作为一个正常的可传递依赖项处理,可以在uber jar的依赖项配置中排除。

夏宏旷
2023-03-14

我不知道你说的“超级罐子”是什么意思。父项目?!

无论如何使用< code > mvn dependency:tree-d includes =:slf4j * 来查看它来自哪里,然后在较低的项目中定义依赖项,并像上面所做的那样排除传递项

希望这有帮助

 类似资料:
  • 主要内容:排除依赖,可选依赖,排除依赖 VS 可选依赖 我们知道 Maven 依赖具有传递性,例如 A 依赖于 B,B 依赖于 C,在不考虑依赖范围等因素的情况下,Maven 会根据依赖传递机制,将间接依赖 C 引入到 A 中。但如果 A 出于某种原因,希望将间接依赖 C 排除,那该怎么办呢?Maven 为用户提供了两种解决方式:排除依赖(Dependency Exclusions)和可选依赖(Optional Dependencies)。 排除依赖

  • 问题内容: 我有一个项目,该项目依赖于由供应商控制的工件。该工件包含一些我依赖的类,其中一些类较旧并且会引起问题。有没有办法让Maven自动扩展jar,删除类并将它们重新打包为依赖项?我会举一个例子。 所以- 我需要使用在项目网站,但我需要使用从神器。我无法修改Supplier:artifact或us:dependency。 有任何想法吗?! 问题答案: 从版本2.0.9开始,maven保留了类路

  • 我有一个编译和运行时所需的依赖项,但我想在运行测试时将其排除。这可能吗?也许,通过设置个人资料?但是,如何仅在生命周期阶段停用它?

  • 例如,我有依赖性:

  • 依赖关系:树是: 有人能帮我解除对验证api: jar: 1.0.0. GA的依赖吗?它似乎在wc pom中作为传递依赖。谢谢

  • 问题内容: 我有一个项目,需要以下Maven jibx插件: 在jibx插件pom内部,有一个xpp3依赖关系,我想从我的项目构建过程中排除它(由于某种原因,我无法在私有存储库中拥有它)。 有没有一种方法可以配置我的pom.xml(而不是插件pom)来排除该依赖关系? 编辑:我试图从插件pom中删除xpp3依赖项,并且该项目可以成功构建,所以我知道依赖项不是强制性的。 问题答案: 这是一个示例,其