9

我正在尝试创建一种方法,可以在仍然依赖项目中的 SNAPSHOT 依赖项的同时实现密封构建。

出于示例的目的,假设我有一个具有如下依赖结构的项目:

             ┌ other-1.2-SNAPSHOT
mine-1.2.3 ──┤
             └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-SNAPSHOT

我想做的是将所有 SNAPSHOT 依赖项在本地解析为与我当前版本相关的内容,然后将它们作为发布部署到我的 Nexus 发布存储库。并非所有这些依赖项都是内部的,因此我不能简单地对每个依赖项进行发布。

所以,在这个例子中,other-1.2-SNAPSHOT会变成类似other-1.2-mine-1.2.3并且thing-3.1-SNAPSHOT会变成thing-3.1-mine-1.2.3。这在大约 60 行 python 中是相对微不足道的。

然而,问题在于将传递性 SNAPSHOT 解析为具体版本。所以我还需要转换gizmo-6.1.3-SNAPSHOTgizmo-6.1.3-mine.1.2.3依赖thing-3.1-mine-1.2.3它。

这只是实现我想要的一种方式的一个例子。目标是在一两年后,我可以检查我的发布分支以获取版本 1.2.3 并能够运行mvn clean package或类似的东西,而不必担心解决早已消失的 SNAPSHOT 依赖关系。

重要的是这个分支是可编译的,而不是仅仅使用类似jar-and-dependencies程序集插件的功能来保留所有依赖项。我希望能够修改源文件并制作另一个版本(例如,应用修补程序)。

所以,

  • 有没有类似的东西能够以递归方式将 SNAPSHOT 依赖项转换为具体的?
  • 是否有任何插件可以为您管理这种事情?发布插件承诺在其branch目标上提供一些配置选项,但它并没有将外部部门解析到我想要的程度。
  • 是否有其他技术可用于创建封闭的 Maven 构建?
4

2 回答 2

2

maven 版本插件将完成您想要的大部分工作。

http://mojo.codehaus.org/versions-maven-plugin/

但是,您几乎肯定需要在预构建步骤中运行它,在该步骤中您解决所有依赖项并相应地更新 pom 文件。然后重新运行 maven(它重新读取 pom)来运行真正的构建。您可能能够配置 pom 本身触发的所有内容,以单独的目标触发,从而避免单独的脚本。

如果您使用特定版本而不是 SNAPSHOT 依赖项并让预构建步骤在必要时升级它们,这会更好。依赖解析的唯一真正区别是 maven 将始终重新下载 -SNAPSHOT 依赖,而如果有新版本可用,它只会下载正常的依赖。然而,许多插件(包括版本插件)以不同的方式处理 -SNAPSHOT 依赖关系,从而导致问题。由于每个 CI 构建都有一个新的版本号,我从不使用 -SNAPSHOT,更喜欢像 -DEV 这样的不同标签,对于开发人员本地构建等具有更可预测的行为。

我花了很多时间让 maven 做类似的事情。我知道的大多数 maven 项目都有某种预构建步骤,以便设置版本号或绕过诸如此类的其他限制。尝试一步完成所有这些通常会失败,因为 maven 只读取 pom 一次,字符串替换在一些地方不起作用,并且部署/安装的 pom 通常不包含字符串替换或所做更改的结果在构建过程中。

于 2012-10-19T11:30:52.393 回答
2

这不是一种广泛使用的技术,但您始终可以将特定的 SNAPSHOT 依赖项作为“项目”存储库检查到您的项目中,如本文所述:Maven 之于 Ant,就像钉枪之于 Hammer

简而言之,使用 Dependencies Plugin在您的项目目录中创建存储库。以下内容是从链接的博客文章中复制的(您应该阅读):

1) 运行mvn -Dmdep.useRepositoryLayout=true -Dmdep.copyPom=true dependency:copy-dependencies

“这将创建 /target/dependencies,并具有所有项目依赖项的类似 repo 的布局”

2)复制target/dependencies/到类似的东西libs/

3) 向您的 POM 添加如下存储库声明:

<repositories>
  <repository>
    <releases />
    <id>snapshots-I-need-forever</id>
    <name>snapshots-I-need-forever</name>
    <url>file:///${basedir}/libs</url>
  </repository>
</repositories>

您将其作为构建/发布过程的自动化部分:第 1 步通过将 Dependencies 插件配置为生命周期阶段,第 2 步使用 AntRun 插件将下载的依赖项移动到正确的位置。

希望这对你有用。我现在得去洗澡了……

于 2012-10-19T18:08:33.333 回答