【问题标题】:mvn release:perform fails because pom file is not at root of repositorymvn release:perform 失败,因为 pom 文件不在存储库的根目录
【发布时间】:2013-07-03 22:16:25
【问题描述】:

我正在尝试执行mvn release:perform,但该命令假定 pom 文件位于存储库的根目录。是否有可以设置为覆盖默认值的系统属性或首选项?

mvn release:prepare 的调用似乎已成功,因为所有发布工件都位于目标目录中并且存储库已正确标记。

如果重要的话,这是一个 git 项目。


编辑这是我所做的:

cd /path/to/git/root/path/to/mvn/project
mvn -DdevelopmentVersion=1.2.0-SNAPSHOT -DreleaseVersion=1.1.0 release:prepare
...enter correct passphrase and choose all default options...
mvn release:perform

然后克隆target/checkout 目录中的远程仓库,经过一些搅动并推送到远程git仓库后,会发生以下错误:

[ERROR]   
[ERROR]   The project  (/path/to/git/root/path/to/mvn/project/target/checkout/pom.xml) has 1 error
[ERROR]     Non-readable POM /path/to/git/root/path/to/mvn/project/target/checkout/pom.xml: /path/to/git/root/path/to/mvn/project/target/checkout/pom.xml (No such file or directory)

所以,maven 是在target/checkout 目录的根目录下寻找 pom 文件,而这并不是它所在的位置。

【问题讨论】:

  • 没有。 Maven 假定 pom 位于当前工作目录和项目的根目录中。它不假定 pom 位于存储库的根目录。一种常见的布局(在 Subversion 中)是 /trunk/ProjectName/pom.xml。 release:prepare 在那里工作。您能否详细说明您在发布执行时遇到的问题?
  • 只是好奇,pom.xml 在哪里,它是否会自动为所有其他任务找到,例如“mvn install”、“mvn compile”?一般来说,你可以使用“mvn -f dir1/dir2/pom.xml”来使用替代的 pom.xml,虽然我从未尝试过使用发布插件。
  • @Keith pom 位于 git repo 根目录下 2 层。我总是从项目根目录(不是 git 根目录)启动命令,所以所有其他 mvn 命令都对我有用,我不需要使用 -f 选项。
  • @Keith 你不应该发表你最后的评论作为答案吗?
  • 最后我放弃了,直接跑了mvn deploy。这很有效,并且不依赖于太多的 maven 魔法(即,maven 没有做任何自动标记和推送,这让我们的 CI 系统感到困惑)。当项目在 svn 下时,我已经完成了这一切,但现在我无法让它在 git 下工作。

标签: maven maven-release-plugin maven-scm-plugin


【解决方案1】:

我遇到了同样的问题。将此添加到您的 pom 中:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-release-plugin</artifactId>
  <version>2.2.1</version>
  <executions>
    <execution>
        <id>default</id>
        <goals>
            <goal>perform</goal>
        </goals>
        <configuration>
            <pomFileName>subdir/pom.xml</pomFileName>
        </configuration>
    </execution>
  </executions>
</plugin>

来源:https://stackoverflow.com/a/8233712/555220

【讨论】:

  • 谢谢。看起来很有希望。正如我所说,我不再使用发布插件。而是使用部署目标。不过,我会尝试一下,看看它是否有效。
【解决方案2】:

由于根 pom 实际上不在源代码控制中,我认为 release:prepare 和 release:perform 对你不起作用。我认为这些命令的目标之一是确保发布的项目可以基于源代码控制来构建(并通过测试),而不是基于一个人的机器上的。这就是它尝试签出和重新构建的原因。如果 pom 根本不在源代码控制中,那么这个目标是不可能的。您可能必须手动执行 release:prepare 和 release:perform 执行的步骤:删除快照、提交、标记、mvn 部署、增量版本添加快照、提交。

【讨论】:

  • 我想你误解了我上面的评论。 pom受源代码控制。它只是不在源代码管理的根目录中。
  • @Andrew,Git 在提交方面没有“子目录”概念,因此您的方案在 Git + maven-release-plugin 方面是不可行的。该插件必须提交/标记整个(Git)项目 - 并且不能这样做。 KISS 整体设计是拥有 1:1 Git-project:build-artifact。也就是说,Maven 子模块可以工作,但您必须在父模块及其所有子模块上运行 maven-release-plugin。
猜你喜欢
  • 2019-11-01
  • 2012-05-28
  • 2016-03-25
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多