如何在不成为当前版本的最新快照的情况下命名包含特定更改的快照?

时间:2016-02-15 09:57:45

标签: maven maven-3 pom.xml

在处理几个内部库中的更改时,我决定为版本添加后缀,因此我可以在依赖项中使用修改后的库,而不会对我正在进行的工作造成其他人的麻烦。
例如:

1.1.0-SNAPSHOT --> 1.1.0-mychange-SNAPSHOT

然而,它导致了一些问题,因为版本1.1.0-mychange的快照仍被视为版本1.1.0的最新快照,并且它打破了我们的一些版本(并且其他人花了一些时间来注意什么造成问题)。

当然我可以简单地使用1.2.0-SNAPSHOT - 但如果有人会想出同样的想法呢? (也改变了1.1.0的候选者,所以把它放在更高的版本中没有多大意义)

问题:是否有更好的方法来创建单独的快照行,这种方式可以保护他人不会意外使用我的快照?

1 个答案:

答案 0 :(得分:2)

在您的情况下,您正在处理同一个库的一个分支(或一般的不同代码库),然后将其合并(可能在某些时候,根据某些标准),因此您应该保留相同的版本。因此,合理的方法是使用Maven classifier

使用分类器,您将具有以下优势:

  • 消费者不会受到您的更改的影响,因为您不会影响官方的SNAPSHOT依赖
  • 消费者可以通过手动更新依赖关系(添加classifier元素)或通过下面介绍的方法轻松地从一个依赖关系切换到另一个依赖关系。
  • 您将通过有意义的分类器名称跟踪更改背后的分支/含义/要求(推荐)
  • Maven将官方SNAPSHOT和您的机密版本保存在相同的Maven存储库位置(相同的groupId,相同的artifactId,相同的版本,即GAV)但是依赖于不同的(实际上,真正独特的坐标是GAVC,其中最后一个C代表分类器)

所以对于依赖:

<dependency>
    <groupId>com.sample</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

你可以:

<dependency>
    <groupId>com.sample</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <classifier>featureA</classifier>
</dependency>

然后,消费者可以简单地决定在需要时声明或手动更改/更新哪个依赖项。或者,他们也可以应用以下方法轻松地仔细检查(编译/测试)您正在处理的依赖项:

<properties>
    <dep.classifier></dep.classifier>
</properties>

<profiles>
    <profile>
        <id>test-classifier</id>
        <properties>
            <dep.classifier>featureA</dep.classifier>
        </properties>
    </profile>
</profiles>

<dependencies>
    <dependency>
        <groupId>com.sample</groupId>
        <artifactId>test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <classifier>${dep.classifier}</classifier>
    </dependency>
</dependencies>

我们在这做什么:

  • 我们将分类器定义为属性,dep.classifier属性(样本名称)
  • 默认情况下,该属性为空,Maven将获取没有分类器的官方依赖(很好的技巧)
  • 在配置文件中,我们将所需的分类器定义为配置文件属性

然后,默认构建通常使用标准依赖项,同时运行:

mvn clean install -Ptest-classifier

mvn clean install -Ddep.classifier=featureA

构建将改为使用您的依赖项(假设它在相关存储库中可用),使消费者能够在开发分支/版本/功能之间轻松切换(和测试)。我刚刚测试了这种方法并且工作正常。