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

Maven 2 - 从传递依赖项版本定义依赖项版本

狄侯林
2023-03-14

我用我的真实情况来说明问题。

我使用logback 1.0.1进行日志记录,它包含SLF4J 1.6.4作为依赖项。我还为遗留日志API(Java . util . logging、log4j和commons-logging)使用SLF4J API桥,它们不是显式的依赖关系。这些也必须(最好)是版本1.6.4。

为了使我的pom.xml尽可能整洁和无错误,我想强制这些API桥接器与SLF4J版本相同。我知道的唯一方法是使用版本1.6.4在我的pom.xml中将它们手动定义为依赖项。如果我更新了logback并且提出了所需的SLF4J版本,我需要记住将桥接API更改为正确的版本。

我能否以某种方式将遗留API的版本与可传递依赖项SLF4J的版本挂钩?

当前pom.xml:

    <properties>
    <org.slf4j.version>1.6.4</org.slf4j.version>
</properties>

<dependencies>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.1</version>
        <!-- requires SLF4J 1.6.4 -->
    </dependency>
    <!-- ... -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j-over-slf4j</artifactId>
        <version>${org.slf4j.version}</version>
        <!-- here, how to bind this version value to SLF4J's version? -->
        <scope>runtime</scope>
    </dependency>
    <!-- the other two bridge API's go here -->
</dependencies>

共有3个答案

祖奇
2023-03-14

只是不要直接依赖顶级绒球中的slf4j。

王兴庆
2023-03-14

依赖收敛可能会帮助你。谢谢你@wemu!

我也有同样的问题。

您可以克隆 https://gist.github.com/f35db1ac6dc8b6f45393.git

<dependencies>
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.3</version>
    <scope>runtime</scope> <!-- depends on slf4j-api:1.7.7 -->
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>${unified.slf4j-api.version}</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${unified.slf4j-api.version}</version>
  </dependency>
</dependencies>
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <unified.slf4j-api.version>1.7.7</unified.slf4j-api.version>
</properties>
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-enforcer-plugin</artifactId>
       <version>1.4.1</version>
       <executions>
         <execution>
           <id>enforce</id>
           <configuration>
             <rules>
               <dependencyConvergence/>
             </rules>
           </configuration>
           <goals>
             <goal>enforce</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
  </plugins>
</build>

在这一点上,事情只是工作。

$ mvn -Dverbose=true dependency:tree verify
...
[INFO] test:enforcer-dependency-convergence-test:jar:0.1-SNAPSHOT
[INFO] +- ch.qos.logback:logback-classic:jar:1.1.3:runtime
[INFO] |  +- ch.qos.logback:logback-core:jar:1.1.3:runtime
[INFO] |  \- (org.slf4j:slf4j-api:jar:1.7.7:runtime - omitted for duplicate)
[INFO] +- org.slf4j:log4j-over-slf4j:jar:1.7.7:runtime
[INFO] |  \- (org.slf4j:slf4j-api:jar:1.7.7:runtime - omitted for duplicate)
[INFO] \- org.slf4j:slf4j-api:jar:1.7.7:compile
[INFO]
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (default) @ enforcer-dependency-convergence-test ---
[INFO]
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...

$

现在让我们更改< code>slf4j-api的版本。

$ mvn -Dunified.slf4j-api.version=1.7.13 -Dverbose=true dependency:tree verify
...
[INFO] test:enforcer-dependency-convergence-test:jar:0.1-SNAPSHOT
[INFO] test:enforcer-dependency-convergence-test:jar:0.1-SNAPSHOT
[INFO] +- ch.qos.logback:logback-classic:jar:1.1.3:runtime
[INFO] |  +- ch.qos.logback:logback-core:jar:1.1.3:runtime
[INFO] |  \- (org.slf4j:slf4j-api:jar:1.7.7:runtime - omitted for conflict with 1.7.13)
[INFO] +- org.slf4j:log4j-over-slf4j:jar:1.7.13:runtime
[INFO] |  \- (org.slf4j:slf4j-api:jar:1.7.13:runtime - omitted for conflict with 1.7.7)
[INFO] \- org.slf4j:slf4j-api:jar:1.7.13:compile
[INFO]
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (default) @ enforcer-dependency-convergence-test ---
[WARNING]
Dependency convergence error for org.slf4j:slf4j-api:1.7.7 paths to dependency are:
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT
  +-ch.qos.logback:logback-classic:1.1.3
    +-org.slf4j:slf4j-api:1.7.7
and
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT
  +-org.slf4j:log4j-over-slf4j:1.7.13
    +-org.slf4j:slf4j-api:1.7.13
and
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT
  +-org.slf4j:slf4j-api:1.7.13

[WARNING] Rule 0: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message:
Failed while enforcing releasability the error(s) are [
Dependency convergence error for org.slf4j:slf4j-api:1.7.7 paths to dependency are:
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT
  +-ch.qos.logback:logback-classic:1.1.3
    +-org.slf4j:slf4j-api:1.7.7
and
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT
  +-org.slf4j:log4j-over-slf4j:1.7.13
    +-org.slf4j:slf4j-api:1.7.13
and
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT
  +-org.slf4j:slf4j-api:1.7.13
]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
...

$
洪博涛
2023-03-14

不是以一种非常美丽的方式:/

有一个专家执行器插件:http://maven.apache.org/enforcer/enforcer-rules/

因此,您可以禁止传递依赖项并包含所需的版本:http://maven.apache.org/enforcer/enforcer-rules/bannedDependencies.html

如果您为良好版本使用属性,则无需在执行器插件版本中搞砸。

 类似资料:
  • 问题内容: 问题。 Gradle依赖管理使得: 没有简便的方法来检查依赖项更新的可用性(仅使用某些第三方插件,如ben-manes / gradle-versions-plugin)并下载更新以替换旧版本; 从远程存储库下载依赖项工件,然后将其存储在gradle缓存中,并在后续构建中重用;但是项目的成功编译必须不依赖于与Internet的连接,远程存储库的可用性以及这些存储库中特定版本的依赖项。

  • 问题。 分级依赖项管理是这样进行的: 检查依赖更新的可用性(仅使用一些第三方插件,如Ben-Manes/Gradle-Versions-Plugin),并下载替换旧版本的更新是不容易的; 依赖项构件从远程存储库下载,然后存储在gradle缓存中,并在后续构建中重用;但项目的成功编译不能依赖于与Internet的连接、远程存储库的可用性以及这些存储库中依赖项的特定版本的存在。 null

  • 我有一个简单的Spring启动应用程序,我试图添加Spring Cloud consul。Spring Cloud consul依赖于较新版本的Spring启动。在我的POM中,我为所有的Spring启动工件指定了版本。 问题是,即使为指定了1.3.5版本,它仍然下载1.2.3版本的依赖项 有没有办法让maven获取所有Spring启动工件的,包括传递依赖项?我知道我可以明确列出它们,但有没有更好

  • Maven正在过渡地使用guava的第16版,尽管我有一个 快速总结: 取决于 有一个父pom,

  • 在我们的项目中,我们使用具有依赖项的库,例如: 作为安全修复的一部分,我们假设使用更高版本的依赖项。通用编解码器:通用编解码器:1.14。在不升级expo-file-system的情况下,有没有办法告诉gradle/maven我们要用一个特定版本的commons-codec:commons-codec?