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

Maven 我的项目使用的依赖项版本是否比我需要的旧?,maven,maven-3,Maven,Maven 3,我工作的地方使用Maven,我们有很多内部库。我们试图以向后兼容的方式进行更改,但有时我们的一个库需要另一个库的更新版本。如果最终产品没有引入更新的库版本,这可能会导致问题 对于每个最终产品,我们都有一个dependencyManagement部分,该部分声明项目应该使用哪些版本的可传递依赖项。我们这样做,而不是让Maven确定要使用哪个版本,因为我们想要控制正在使用哪些版本的库 即使我们让maven知道应该使用哪些版本的库,也有可能使用较旧的库,这可能导致ClassNotFoundExcept

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

对于每个最终产品,我们都有一个
dependencyManagement
部分,该部分声明项目应该使用哪些版本的可传递依赖项。我们这样做,而不是让Maven确定要使用哪个版本,因为我们想要控制正在使用哪些版本的库

即使我们让maven知道应该使用哪些版本的库,也有可能使用较旧的库,这可能导致ClassNotFoundException,等等

当项目的某个依赖项需要更新版本时,是否有Maven插件或方法来确定我的项目是否使用旧版本的依赖项?

mvn依赖项:tree
,但是我们有很多依赖项,我不想手动查看庞大的列表

谢谢

编辑

因为我们有很多库,如果最终产品使用库A、B和C,而A和B都使用不同版本的C,那么并不总是使用最新版本的C。发件人:

依赖项中介-这决定了依赖项的版本 将在遇到工件的多个版本时使用。 目前,Maven 2.0仅支持使用“最近的定义” 这意味着它将使用最接近的依赖项的版本 您的项目位于依赖关系树中。你总是可以保证 通过在项目的POM中显式声明它来创建版本。注意,如果 两个依赖项版本在依赖项树中的深度相同, 在Maven 2.0.8之前,还没有定义哪一个会赢,但从那时起 Maven 2.0.9重要的是声明中的顺序:第一个 声明获胜


我不确定是否有一个插件可以按照你的要求运行。一般来说,你会选择一个较新的版本,但这并不总是一个硬性规定——有时你会选择一个较新的版本,但实际上你需要的是一个较旧的版本

根据我的经验,您必须孤立地处理每个依赖性问题。

我们处理这个问题的方法是按照您的建议,结合使用
部分,以及带有
规则的插件

:

…要求依赖项版本号一致。如果一个项目 两个依赖项A和B都依赖于同一工件C, 如果A依赖于不同版本的C,则此规则将使生成失败 然后,B依赖于C的版本

基本上,如果在
依赖关系树中有相同库的两个不同版本,那么
验证阶段将失败

因此:

我这样做的方式是-我们通常有多模块
Maven
项目,我尝试在父级的
部分定义通用的依赖版本-例如
Spring
Jersey
等。然后在子模块级别,根据需要定义specialist
部分

在我们所有的POM中,我们定义了使用
规则配置的
Maven Enforcer
插件,如下所示:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.3.1</version>
    <executions>
    <execution>
        <id>enforce-versions</id>
        <goals>
        <goal>enforce</goal>
        </goals>
    </execution>
    </executions>
    <configuration>
    <rules>
        <DependencyConvergence/>
    </rules>
    <fail>true</fail>
    </configuration>
</plugin>

org.apache.maven.plugins
以及创造财富的能力

如果它真的是你一直想要的
依赖关系的
最新版本
,我相信你可以编写一个简单的规则来实现它

希望这有帮助


Will

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

发件人:

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

这里有一个具体的例子。这将导致生成失败:


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

我想我很困惑。您有一个pom.xml,因此可以控制自己的依赖项。Maven 3有可传递的依赖项,所以如果您正在使用的东西需要更新的依赖项,它将代表您获得它。。。你应该使用它。是的,我使用的是Maven 3。你需要定义依赖项,而不仅仅是依赖项管理部分。您所使用的方法听起来是错误的,因为如果您定义了一个版本的库(a),它会自动暗示一些可传递的依赖项(例如Lib B、Lib C)。Lib B和Lib C使用Lib D。因此,如果你更改了D,你必须更改Lib B和Lib C的pom文件中的版本,当然还有Lib A的pom中的版本。此外,如果你有这样的依赖性,可能值得考虑多模块构建而不是单个项目。啊,不知道这个规则。很好的发现。
  <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
]