18

我经常不得不分叉一个使用 Maven 的 Java 项目(通常在 github 上)。

当我 fork 项目并进行更改时,我通常希望将发布版剪切到我自己的私有(但在 Internet 上)maven 存储库。

因此,我的自定义版本应该是什么版本标签的问题。我不能这样做SNAPSHOT,因为我需要它来发布。有时我会在项目后缀.ADAMGENT(因为我是个自恋者)。可以说我 fork 1.0.4-SNAPSHOT。我可能会将其更改为1.0.4.ADAMGENT. 我不知道这是否是个好主意。在某些情况下,我什至不能为它加上后缀,.ADAMGENT因为 Spring 的 Gradle 构建工具不喜欢这样。因此,对于我所做的 Spring 项目,.ADAMGENT.RELEASE或者.ADAMGENT.M1如果它是一个里程碑。

别人做什么?

更新: 虽然我说的是分叉,但我提到了更多的补丁级别更改。另一方面,赏金(由不同的用户)可能是 fork 和/或 patch

4

4 回答 4

22

因为您正在分叉,所以请使用不同的组 ID。

现实情况是,一旦您开始对本地分叉进行更改,它就是一个不同的工件。由您的组织制作的工件,而不是您从中获取的工件。

关于版本号,如果您的更改始终是次要的,我会在分叉时使用源树的主要版本号和可能的次要版本号,否则,我会从 1.0.0 重新开始,在项目 POM 中记下我从哪个版本分叉它。

例如:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.adamgent</groupId>
    <artifactId>project-xyz</artifactId> <!-- same artifact ID -->
    <version>1.0.0-RELEASE</version>
    <name>My Project XYZ</name> <!-- different display name -->
    <description>My fork of project XYZ created from v5.42.0 of original sources.</description>
    ....

为依赖项切换组 ID 并不比切换版本 ID 更难。这两种机制都可用于轻松获得所需的发布工件。但是,通过更改组 ID,您可以获得以下优势:

  1. 您可以更轻松地在 Nexus 中跟踪您的分叉
  2. 您消除了可能因拥有非他们创建的组织的工件而引起的任何混淆
  3. 您遵守Maven 版本标识符的标准准则
于 2013-12-03T14:25:25.993 回答
5

我通常会添加一个后缀(例如名称),然后添加一个运行编号,以避免混淆我基于上游版本制作的多个版本。在您的设置中,这可能会转化为如下内容:

1.0.4-ADAMGENT-1

1.0.4-ADAMGENT-2如果您必须进行另一次更改,则随后会执行此操作。

绝对保留原始项目中的artifactgroupID 以及您更改所基于的版本,如果您必须找出您一直在处理的版本,这将在以后派上用场。如果您的更改包含在上游,它可以更轻松地切换到正式版本。

于 2012-05-03T09:39:00.257 回答
2

如果它是一个快照,我建议使用原始修订号(这可能与 git

例如

1.0.4-2011-09-12.ADAMGENT
于 2012-05-02T14:35:18.803 回答
1

我确实想出了自己的解决方案。我不会将其标记为正确,因为我认为@DavidH 确实有一些有效点,如果 Maven 具有 Ivy 替换 groupid 的配置级别(和/或我在 sonatype 中想出了如何做到这一点)我可能会标记它正确的。否则,我坚信 fork 应该是不同的命名空间,Java 包名称应该与您的项目 groupid 有点内联。同样对于我的情况,我经常需要这样做来修复错误,所以它不是分叉。

这就是我所做的,它基于 maven 如何读取版本号以及 Sonatype 在某种程度上做了什么:

首先,我设置了我自己的公共但非中央存储库,我将在其中发布我的版本。您可以使用 github 和/或 googlecode 来托管这样的 repo。网上有关于如何做到这一点以及如何发布到它的指南,所以我不会深入探讨。

对于版本号,除了 Spring 之外,我遵循这种格式,因为 Spring 的构建系统有我的问题中提到的奇怪要求:

1.0.4-ADAMGENT-1

更多更改和发布:

1.0.4-ADAMGENT-2

通过查看代码,您可以看到 Maven 大多会理解这种格式。问题是ADAMGENT限定符。Maven 只能正确理解几个限定词“alpha”、“beta”、“milestone”、“rc”、“snapshot”、“”、“sp”` 和“ga”、“final”、“cr”

它不是词汇排序的(ADAMGENT在这种情况下)这很好,我想4如果这是一个问题,你可以升级增量版本()。

于 2013-12-05T17:36:58.540 回答