在Maven中,依赖关系通常是这样设置的:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

现在,如果您使用的是频繁发布的库,那么不断更新<version>标记可能会有些烦人。有没有办法告诉Maven始终使用最新的可用版本(来自存储库)?


当前回答

注:

6年前,Maven 3中的插件依赖性“为了可复制的构建”,已经删除了上述最新和发布元版本。(对于常规依赖关系,它们仍然工作得很好。)有关插件依赖关系,请参阅此Maven 3兼容解决方案。


如果您总是想使用最新版本,Maven有两个关键字可以作为版本范围的替代。您应该小心使用这些选项,因为您不再能够控制正在使用的插件/依赖项。

当您依赖插件或依赖项时,可以使用LATEST或RELEASE的a版本值。LATEST是指特定工件的最新发布或快照版本,即特定存储库中最近部署的工件。RELEASE是指存储库中的最后一个非快照版本。通常,设计依赖于工件的非特定版本的软件不是最佳实践。如果您正在开发软件,您可能希望使用RELEASE或最新版本,以便在发布第三方库的新版本时不必更新版本号。当您发布软件时,您应该始终确保您的项目依赖于特定版本,以减少您的构建或项目受到不受您控制的软件版本影响的可能性。如果需要,请谨慎使用“最新”和“释放”。

有关详细信息,请参阅Maven书中的POM语法部分。或者参见本文档中的依赖版本范围,其中:

方括号([&])表示“闭合”(包括)。括号((&))表示“开放”(排他)。

下面是一个示例,说明了各种选项。在Maven存储库中,com.foo:myfoo具有以下元数据:

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

如果需要对该工件的依赖性,您可以选择以下选项(当然可以指定其他版本范围,只需在此处显示相关版本):

声明精确版本(始终解析为1.0.1):

<version>[1.0.1]</version>

声明显式版本(将始终解析为1.0.1,除非发生冲突,否则Maven将选择匹配的版本):

<version>1.0.1</version>

声明所有1.x的版本范围(当前将解析为1.1.1):

<version>[1.0.0,2.0.0)</version>

声明开放式版本范围(将解析为2.0.0):

<version>[1.0.0,)</version>

将版本声明为最新版本(将解析为2.0.0)(从maven 3.x中删除)

<version>LATEST</version>

将版本声明为RELEASE(将解析为1.1.1)(从maven 3.x中删除):

<version>RELEASE</version>

注意,默认情况下,您自己的部署将更新Maven元数据中的“最新”条目,但要更新“发布”条目,您需要从Maven超级POM激活“发布概要文件”。您可以使用“-Prelease profile”或“-DperformRelease=true”执行此操作


值得强调的是,任何允许Maven选择依赖性版本(最新版本、释放版本和版本范围)的方法都会让您面临构建时问题,因为后续版本可能会有不同的行为(例如,依赖性插件先前将默认值从true切换为false,结果令人困惑)。

因此,在版本中定义准确的版本通常是一个好主意。正如Tim的回答所指出的,maven版本插件是更新依赖关系版本的便捷工具,特别是版本:使用最新版本和版本:使用最近版本目标。

其他回答

有时您不想使用版本范围,因为它们似乎很难解决您的依赖关系,尤其是在持续交付且有大量版本的情况下——主要是在繁重的开发过程中。

一种解决方法是使用版本maven插件。例如,可以声明属性:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

并将版本maven插件添加到pom文件中:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

然后,为了更新依赖关系,您必须执行以下目标:

mvn versions:update-properties validate

如果有比1.1.1更新的版本,它将告诉您:

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

使用过最新快照的用户,请确保您有-U,否则将无法获取最新快照。

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories

如果你想让Maven使用最新版本的依赖项,那么你可以使用版本Maven插件以及如何使用这个插件,Tim已经给出了一个很好的答案,跟随他的答案。

但作为一名开发人员,我不会推荐这种类型的实践。为什么?

Pascal Thivent在问题评论中已经给出了原因的答案

我真的不推荐这种做法(也不使用版本范围)为了构建再现性。突然开始的构建由于未知原因而失败比手动更新更令人讨厌版本号。

我将推荐这种做法:

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

它易于维护和调试。您可以随时更新POM。

在提出这个问题时,maven中的版本范围存在一些问题,但这些问题已经在maven的新版本中得到解决。本文很好地捕捉了版本范围的工作原理和最佳实践,以更好地理解maven如何理解版本:https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855

现在我知道这个话题已经过时了,但是阅读这个问题和OP提供的答案,Maven版本插件实际上可能是对他的问题的更好答案:

特别是以下目标可能有用:

版本:使用最新版本在pom中搜索所有版本其为较新版本将其替换为最新的版本版本:使用最新版本在pom中搜索所有非SNAPSHOT更新的版本释放并替换为最新版本。版本:更新属性更新在中定义的财产项目,使其与的最新可用版本特定依赖关系。这可能是如果一组依赖项必须全部锁定到一个版本。

还提供了以下其他目标:

版本:显示相关性更新扫描项目的相关性和生成这些的报告具有更新版本的依赖项版本可用。版本:显示插件更新扫描项目的插件和生成这些插件的报告其具有可用的更新版本。版本:更新父项更新项目的父部分,以便它引用了最新的可用版本。例如,如果你使用的是企业根POM,这个如果你需要的话,这个目标会很有帮助确保您使用的是最新的企业根POM的版本。版本:更新子模块更新项目的子模块版本与当前项目。例如,如果您有一个聚合器pom它的项目的父级骨料和儿童以及父版本不同步,这mojo可以帮助修复子模块。(注意,您可能需要在中使用-N选项调用Maven如果您的这个项目被破坏得很厉害无法生成,因为版本不匹配)。版本:锁定快照在pom中搜索所有-SNAPSHOT版本,并将其替换为当前时间戳版本-快照,例如-20090327.172306-4版本:解锁快照在pom中搜索所有时间戳锁定的快照版本和替换他们用-SNAPSHOT。版本:解析范围使用版本范围和将范围解析为特定正在使用的版本。版本:使用releases在pom中搜索所有SNAPSHOT版本已发布并替换它们具有相应的版本版本版本:使用下一个版本在pom中搜索所有非SNAPSHOT更新的版本释放并替换为下一版本。版本:使用下一个版本在pom中搜索所有版本其为较新版本将其替换为下一版本。versions:commit删除pom.xml.versionsBackup文件。形式内置“穷人”的一半SCM”。版本:revert从pom.xml.versionsBackup文件。形式内置“穷人”的一半SCM”。

我只是想把它包括在内,以备将来参考。