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

我的项目是否使用了比我需要的更旧版本的依赖项?

邵修诚
2023-03-14

我工作的地方使用Maven,我们有很多内部库。我们尝试以向后兼容的方式进行更改,但有时我们的一个库需要另一个库的较新版本。如果最终产品没有加入较新的库版本,这可能会导致问题。

由于我们有很多库,如果最终产品使用了库A、B和C,而A和B都使用了不同版本的C,那么并不总是使用最新版本的C。从介绍到依赖机制

依赖项中介--这确定当遇到工件的多个版本时,将使用依赖项的哪个版本。目前,Maven2.0只支持使用“最近的定义”,这意味着它将使用依赖项树中与项目最接近的依赖项的版本。您总是可以通过在项目的POM中显式声明一个版本来保证它。请注意,如果两个依赖版本在依赖树中处于相同的深度,在Maven2.0.8之前,还没有定义哪一个版本会获胜,但自从Maven2.0.9以来,声明中的顺序是重要的:第一个声明获胜。

共有1个答案

扶高歌
2023-03-14

由于我们几乎总是以向后兼容的方式进行更改,看起来对我们来说最好的解决方案是确保使用了最新版本的依赖项。具有“要求上限依赖项”特性的Maven Enforcer插件实现了这一点。

摘自http://maven.apache.org/enforcer/enforcer-rules/requireupperbounddeps.html:

此规则要求生成期间解析的每个依赖项的版本等于或高于所有可传递依赖项声明。在构建过程中解析的每个依赖项的版本通常是POM中指定的版本或者传递步骤最少的版本(“最近的”定义)。有关Maven依赖项解析的更多信息,请参阅Maven站点。

  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.4.0</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>0.9.9</version>
      <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
    </dependency>
  </dependencies>

这是日志消息:

Failed while enforcing RequireUpperBoundDeps. The error(s) are [
RequireUpperBoundDeps error for org.slf4j:slf4j-api:1.4.0 paths to dependency are:
+-test:TestParent:1.0-SNAPSHOT
  +-org.slf4j:slf4j-api:1.4.0
and
+-test:TestParent:1.0-SNAPSHOT
  +-ch.qos.logback:logback-classic:0.9.9
    +-org.slf4j:slf4j-api:1.5.0
]

我们可能会在一个可以打开或关闭的配置文件中设置这个插件。

 类似资料:
  • 我有一个使用SLF4J的项目,SLF4J也使用log4j1.2.17(默认情况下,没有在pom.xml中指定任何版本)。 嗨,我想升级Log4J版本到2.17.1,有关于如何操作的信息https://logging.apache.org/log4j/2.x/maven-artifacts.html 我在pom中添加了以下代码。xml文件 然后,当我检查Maven依赖项时,它会在我的项目中显示旧版本

  • 如果我有一个maven项目,它对A和B版本2.0有显式依赖,而A对B版本1.0有传递依赖。较新版本的B会覆盖较旧版本吗?我使用了maven Depencdy:解析目标,看起来旧版本的B没有解析。如果A与较新版本的B不兼容怎么办?或者如果A依赖于B版本2.0,而我的项目在运行依赖关系后对B版本1.0有显式依赖:解析目标,那么我看不到B的较新版本。那么如何解决这些依赖关系呢? 当我使用resolve

  • 与将eclipse的maven prefs设置为脱机并在我想获取依赖项时使用maven命令行相比,有没有更好的方法来处理eclipse&maven呢? Eclipse+maven通过m2e下载的二进制文件与我的源代码不同步。 在处理bug时,我希望控制何时将源代码和依赖项拉入eclipse工作区。然而,我的持续集成系统总是在构建新的快照供我获取。有时eclipse会获取依赖项,这会破坏我的本地构建

  • 我有一个新的库,叫做代码。它依赖于我创建的另外两个库,称为Template Featherweight和XBN-Java。但主要的库--我正试图让其他人使用的库!--是Codelet。另外两个是次要的。两者都是必需的,但只有在需要高级特性时才直接使用。 null null 我终于通过将JAR上传到Maven Central,至少上传到一次,这是一个很大的进步。 然而,我意识到,为了让其他人真正使用

  • 问题内容: 我有一个简单的Java 9 SE项目,该项目仅依赖于一个非模块化项目(在本示例中选择Weld SE),并且尝试使用Maven()构建它。为了添加Java 9,我添加了。最初,此文件仅包含模块名称,没有公式。 请记住,我唯一的依赖是不是一个模块化的项目,因此,我认为Maven会放在类路径中(不模块路径),因此它会在结束中描述的模块化系统的状态。 现在,我的Maven版本是3.3.9,并且

  • 在我的spring项目中,我可以像这样用XML定义bean: