Maven-Release-Plugin:强制使用特定版本的scm提供程序

时间:2013-06-21 11:05:50

标签: git maven maven-release-plugin

我正在尝试将我们的存储库从SVN迁移到Git,而我在一个非常大的项目中遇到了发布插件的问题。

问题:

这个项目大约有50多个子模块,它试图将所有修改过的poms添加为一个'git add - '。这会破坏Windows命令行限制。

幸运的是,在maven-scm-provider-gitexe的1.8.1版本中已经修复了这个问题,但maven-release-plugin目前设置为使用1.7而没有修复。

我已经尝试将以下内容添加到我的root pom.xml中,但我仍然可以看到它在mvn版本中下载1.7:准备甚至以详细模式运行该过程都没有表明它正在使用1.8.1。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.3.2</version>
    <executions>
      <execution>
        <id>default</id>
        <goals>
          <goal>perform</goal>
        </goals>
        <configuration>
          <pomFileName>subproj/pom.xml</pomFileName>
        </configuration>
      </execution>
    </executions>
    <dependencies>
      <dependency>
        <groupId>org.apache.maven.scm</groupId>
        <artifactId>maven-scm-api</artifactId>
        <version>1.8.1</version>
      </dependency>
      <dependency>
        <groupId>org.apache.maven.scm</groupId>
        <artifactId>maven-scm-provider-gitexe</artifactId>
        <version>1.8.1</version>
      </dependency>
    </dependencies>
  </plugin>

我还尝试将以下内容添加到pom.xml中,以防强制它使用正确的版本而不再运气。

<extensions>
    <extension>
      <groupId>org.apache.maven.scm</groupId>
      <artifactId>maven-scm-provider-gitexe</artifactId>
      <version>1.8.1</version>
    </extension>
</extensions>    

我怀疑它没有使用1.8.1的原因是它仍然无法尝试使用所有pom文件进行git添加,而我已经检查了插件源代码,它看起来应该是单独添加每个文件Windows(我甚至仔细检查了codehaus plexus Os.isFamily(Os.FAMILY_WINDOWS)以确保在我的机器上返回true。

我错过了什么?如何强制发布插件使用正确版本的scm插件?

3 个答案:

答案 0 :(得分:4)

根据maven发布插件2.4.1 changelog http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=11144&version=19050,由于'git status --porcelain'的错误,SCM在此版本中已经回落到1.7。

  • 所以你应该尝试2.4版本。它应该工作,也许你不会受到这个bug的影响。
  • 或等待未来版本......

编辑: 该错误与此SCM错误有关:http://jira.codehaus.org/browse/SCM-686

评论说要使用maven-scm-provider-gitexe AND maven-scm-provider-git-commons作为依赖项

<dependencies>
    <dependency>
      <groupId>org.apache.maven.scm</groupId>
      <artifactId>maven-scm-provider-gitexe</artifactId>
      <version>1.8.1</version>
    </dependency>
   <dependency>
    <groupId>org.apache.maven.scm</groupId>
    <artifactId>maven-scm-provider-git-commons</artifactId>
    <version>1.8.1</version>
   </dependency>       
</dependencies>

答案 1 :(得分:1)

愚蠢的问题,但是,你有没有想过将所有这些子模块移动到他们自己的git项目中?并单独发布它们?

答案 2 :(得分:0)

正如Aurelien建议的那样,将子项目提取到单独的模块中。遵循这一原则将使您的生活更简单。您不必释放没有更改的模块,只是为了发布。此外,构建时间将被删除。如果您查看Github上托管的大多数Java项目,您会发现很多人已将每个模块提取到单独的项目中。 Git主要用于处理较小的存储库。

您可以像这样提取子目录的历史记录:

git remote rm origin
git filter-branch --subdirectory-filter ${project} HEAD
git remote add origin git@foo.com:path/to/${project}.git
git branch --set-upstream master origin/master
git push

我相信,不是你要找的答案之王,但我认为这可以帮助你走上正确的道路,如果你不移动这样的所有项目,至少,它会缩短你的清单,也许,帮助你解决问题。