Maven发布插件 - 需要SNAPSHOT项目

12
我正在使用Jenkins中的M2发布插件,该插件内部调用maven-release-plugin 2.3.2,并在构建时抛出此错误:You don't have a SNAPSHOT project in the reactor projects list。问题是,我的项目pom文件的版本确实为1.0.0-SNAPSHOT。我漏掉了什么吗? com.abc.def是公司的父POM,我只是针对utils进行mvn发布。
<modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.abc</groupId>
        <artifactId>def</artifactId>
        <version>1.0.0</version>
    </parent>

    <groupId>com.abc.def</groupId>
    <artifactId>utils</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>utils</name>

是的,我已经进行了基本的Google和Stack Overflow搜索,它们都指出我的POM应该具有SNAPSHOT版本,而实际上已经有了。只是我的公司父级POM不是快照版本。这可能是原因吗?


这是单个模块还是多模块构建的父级,因为它的打包方式是pom? - khmarbaise
它有两个并行的子项.. 都是jar包,都是SNAPSHOT版本。 - Pulak Agrawal
你所说的“M2发布插件”是指调用maven-release-plugin吗?你的命令行具体是什么? - Petr Kozelka
抱歉..我应该提到..我实际上正在使用Jenkins,它有一个名为M2 release plugin的插件(https://wiki.jenkins-ci.org/display/JENKINS/M2+Release+Plugin),它只是从UI中利用maven-release-plugin,并且我目前无法直接从mvn进行测试。 - Pulak Agrawal
你能展示一下父文件夹和它们的子文件夹的目录结构吗? - khmarbaise
@khmarbaise,请查看我在tohokami上的最新评论。谢谢。 - Pulak Agrawal
5个回答

14

我有过同样的问题,但这些解决方案都没有起作用。 Tomek Kaczanowski的这篇博客文章解决了问题。

问题的原因通常是Jenkins SVN策略设置为“尽可能使用svn更新”,这不会在构建之间清除构建工作区。

当您尝试创作一个发行版时,Jenkins会更新您的pom并创建一些临时文件。如果发行版失败,则这些pom更新和临时文件将不会被清除。因此,当您修复pom并尝试重新构建时,由于这些奇怪的工作区残留物令Jenkins混淆,您会得到“在反应堆项目列表中找不到SNAPSHOT项目”的错误。

解决方法是更改Jenkins SVN策略。以下任何一种都应该有效:

  • 始终检出新副本
  • 通过首先删除未版本化/已忽略的文件,然后进行“svn更新”来模拟清理检出
  • 尽可能使用svn更新,在更新之前使用“svn revert”

我还建议您清除Jenkins工作区,以确保您从头开始。


2
你说得对。在我发布这个问题的时候,我还在学习Maven-Jenkins的相关知识,但几天后我自己也发现了同样的问题。本应该更正我的回答,但由于你先发布了,所以我必须给予你答案。感谢你的修正。 - Pulak Agrawal
你能具体说明需要清理什么吗? - Dusan Plavak
@DusanPlavak 当我编写这篇文章时,工作区上有一个删除工作空间的按钮。 我不再使用旧样式的工作,并且我也没有看到这个按钮。但是下面是使用管道语法进行操作的方法: steps { deleteDir() } }``` - Marquee

5

pom文件不需要是SNAPSHOT(在我们公司我们有同样的设置,它可以正常工作)。就我所知,utils pom的这部分是没有问题的,所以你可能错过了其他东西,比如:

<scm>
    <developerConnection>scm:${release-scm}</developerConnection>
</scm>

当然也包括在您的POM构建定义中maven release plugin部分吗?(我知道这有点困难)

我创建了一个类似于您的测试项目(没有快照的主分支,POM打包),并将其通过Jenkins v1.488和m2 release插件v0.9.1。Master正在使用release插件v2.2.1和scm插件v1.5。除了一个非常可疑的情况外,我无法重现此问题。也就是说,我遇到相同错误的唯一时间是当POM的版本不以SNAPSHOT结尾时,例如1.0.0-SNAPSHOT-suffix。这可能会发生,因为开发人员为每个问题创建分支(版本中的人为错误)。您的子模块是否在版本中有这种情况? - tohokami
另外,如果您不介意发送已清理的pom版本,我很乐意将它们通过Jenkins运行并查看结果。或者,如果您愿意,我可以清理我们的版本并发送给您。 - tohokami
这是我做的:我在“utils” POM中注释掉了<modules>..</modules>,然后我遇到了另一个与访问相关的错误;我需要进行更多测试,但看起来我会找到罪魁祸首是其中一个子POM在跟我玩..周一就会确定 - TGIF :) - Pulak Agrawal
没起作用..不过我找到原因了。看看我的答案。 - Pulak Agrawal
1
有趣!通常删除本地m2 repo就可以解决所有这样的问题,当然,当artifact(在您的情况下是master pom)版本升级时也不会发生这种情况(我想您也这样做了)。好的,很高兴你解决了它 :-) - tohokami
显示剩余2条评论

5

有时我会发现“SNAPSHOT”这个术语的拼写问题,这基本上也会导致同样的错误。例如:

 1. SNAPSOT
 2. SNASHOT
 3. SHNAPSOT

如果涉及到it技术,检查一下这个是值得的。

修复问题的好方法是在父POM中使用:

versions:set

2
+1 我整天都无法打出 SNAPSHOT。哦,现在我终于打出来了。 - Josh
版本设置在这里有解释:http://mojo.codehaus.org/versions-maven-plugin/examples/set.html - koppor

3

实际上,Jenkins的工作空间包含一些模块的旧非SNAPSHOT版本。尝试清除工作空间(即清理并清除它),然后再次发布,他将获得带有后缀-SNAPSHOT的更正版本。


2
我找到了原因:最新的公司 Parent POM 没有被选中。
  1. 我在 mvn 参数列表中使用了 clean-U,但并没有起作用。
  2. 然后我清理了 ~/.m2 仓库,但也没有起作用。
在 Jenkins 中,以下步骤有效:
  1. 进入 Job config 页面。
  2. 进入 Build,点击 Advanced
  3. 勾选 Use private Maven repository 复选框。
  4. 选择 Local to the workspace。点击 Save
我知道这是 Maven 经常做的奇怪事情之一。通常错误信息不够详细/直观。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接