创建密封Maven构建

时间:2012-10-19 01:40:36

标签: maven build-automation maven-3 maven-plugin

我正在尝试创建一种方法,可以在仍然依赖项目中的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.3thing-3.1-SNAPSHOT将变为thing-3.1-mine-1.2.3。这在大约60行蟒蛇中相对微不足道。

然而,问题在于将传递SNAPSHOT解析为具体版本。所以我还需要将gizmo-6.1.3-SNAPSHOT转换为gizmo-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构建?

2 个答案:

答案 0 :(得分: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通常不包含字符串替换的结果或所做的更改在构建期间。

答案 1 :(得分:2)

这不是一种广泛使用的技术,但您可以随时将特定的SNAPSHOT依赖项作为“项目”存储库检入项目中,如本博文中所述:Maven is to Ant as a Nail Gun is to a Hammer

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

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

“这会创建/ target / dependencies以及所有项目依赖项的repo-like布局”

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插件配置为生命周期阶段,使用AntRun插件将步骤2移动到正确的位置。

希望这适合你。我现在得洗个澡......