2012-10-19 56 views
9

我正在尝试创建一个方法,在其中仍然依靠项目中的SNAPSHOT依赖关系实现密封构建。创建密封Maven构建

例如而言,说我有具有依赖结构这样一个项目:

   ┌ other-1.2-SNAPSHOT 
mine-1.2.3 ──┤ 
      └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-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功能保留所有依赖关系是很重要的。我希望能够修改源文件并进行其他版本构建(例如应用修补程序)。

所以,

  • 有这样可用,将能够快照依赖转换以递归的方式是具体什么?
  • 有没有可以为你管理这种事情的插件?发布插件已承诺在其branch目标上提供一些配置选项,但它无法解决我想要的程度的外部代码。
  • 是否有其他技术可用于创建密封Maven构建?
+3

听起来像一个反Maven破解我。在Maven中,基本的基本规则之一是** Convention Over Configuration **。如果依赖是由你自己创建的,你应该自己管理/使用SNAPSHOT/RELEASE版本。如果他们来自其他地方,则应始终使用最新版本(而不是SNAPSHOT版本)。再来看看[Maven The Complete Reference - 3.3.1节](http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-syntax.html#pom-reationships -sect版本),并了解为什么SNAPSHOT在Maven中使用。 – yorkw

+0

我非常全面地了解Maven的基础知识。然而,我生活在现实世界中,期限和第三方库非常有用,但它们在SNAPSHOT版本上的使用时间很长。 Jason Van Zyl,你可能知道,甚至承认围绕版本发布过程繁重系统的想法是一个巨大的错误(并且随特斯拉而改变)。对于我们所消费的所有项目来说,维持内部分配的作用不大,我所做的实际上是比大多数人更好的跳跃。 –

+1

甚至在现实世界中也应该考虑到一些原因。你在这里与系统作战。正如你所提到的,快照不够长 - 即使你使用时间戳快照来依靠工件解析。我的方法是使用依赖和部署插件来检索所有工件,并通过使用脚本或一些自制的Maven插件将已知的快照依赖关系部署到自己的Maven仓库中。也许与其他小玩意交谈也有帮助:如果他们可以发布他们的工件的测试版本,你可以依靠那些没有太多杂乱的东西。 – wemu

回答

2

这不是一个广泛使用的技术,但可以随时查询您的具体快照依赖到您的项目作为一个“项目”资料库,在这个博客帖子描述:Maven is to Ant as a Nail Gun is to a Hammer

总之,使用依赖插件创建位于您的项目目录中的存储库。下面从链接的博客文章复制(你应该读):

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

“这将创建/你的所有项目的依赖关系的回购式布局目标/依赖”

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> 
012通过配置依赖插件的生命周期phasephase步骤1中,和步骤2用AntRun插件的下载依赖移动到合适的位置..

希望这:

你让这个您的构建/发布过程的自动化部分为你工作。我现在得去洗个澡...

+0

我没有完全做到这一点,但未来的旅行者可能会想要这个解决方案。我创建了一个特殊的nexus存储库并将自定义版本部署到它中,然后通过脚本更新pom,就像我在原始文章中描述的那样。然而,我在上一份工作中使用了这种技术,并且在类似的使用案例中表现卓越。 –

2

该maven版本插件将做你想要的大部分。

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

然而,你将几乎certianly需要在您解决所有的依赖关系,并相应地更新POM文件的生成前阶段运行。然后重新运行maven(重新读取pom)以运行实际构建。您可能能够配置pom中的所有内容,并使用单独的目标触发,从而避免使用单独的脚本。

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

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