在POM中,相对于父级SCM URL的SCM URL是什么意思?

6
我有一个由多个模块和子模块组成的Maven项目。 我使用SVN对源文件进行版本控制。
简短的故事: 如何在POM文件的scm属性中指定URL,这些URL相对于其父级的URL。
长篇故事: 一些模块及其子模块共享相同的版本号/发布流程,而其他模块则使用独立的版本号。对于具有独立版本号的模块,我设置了分支/主干/标记布局,以使发布插件正常工作。
为此,在我的存储库中有两个SVN布局。一个包含所有的主干/分支/标记混乱,另一个包含一个干净的、准备好进行检出的工作目录,其中包含对主干的svn:external引用。
它看起来像这样:您有真实的SVN布局,其中包含主干/分支/标记混乱: pom.xml(主要父级) utils branches tags trunk pom.xml、src、target等 data-model(已发布) branches tags trunk pom.xml lib pom.xml、src、target等 server pom.xml、src、target等 client pom.xml、src、target等 bin-modules bin-module-1(已发布) branches tags trunk pom.xml、src、target等 bin-module-2(已发布) branches tags trunk pom.xml、src、target等
以及工作目录的干净布局,使用“svn:externals”标签隐藏分支/主干内容:
  • pom.xml(主要父级项目)
  • utils(-> utils/trunk
    • pom.xml、src、target等...
  • data-model(-> data-model/trunk
    • pom.xml
      • lib
        • pom.xml、src、target等...
      • server
        • pom.xml、src、target等...
      • client
        • pom.xml、src、target等...
  • bin-modules
    • pom.xml
    • bin-module-1(-> bin-module-1/trunk
      • pom.xml、src、target等...
    • bin-module-2(-> bin-module-2/trunk
      • pom.xml、src、target等...

到目前为止,一切都很好。 我已经在我的父POM中设置了根SCM URL,并且Maven正确地暗示了子模块的URL。 我用 mvn help:effective-pom 检查过。

我有以下SCM URL:

  • root: [根URL]
  • utils:[根URL]/utils
  • data-model:[根URL]/data-model/
  • data-model /lib:[根URL]/data-model/lib
  • data-model/client:[根URL]/data-model/client
  • data-model/server:[根URL]/data-model/server
  • bin-module-1:[根URL]/bin-module-1/
  • bin-module-2:[根URL]/bin-module-2/

但是Maven没有意识到实际的SVN布局。 我希望它看到:

  • root:[根目录链接]
  • utils:[根目录链接]/utils/trunk
  • data-model:[根目录链接]/data-model/trunk
  • data-model/lib:[根目录链接]/data-model/trunk/lib
  • data-model/client:[根目录链接]/data-model/trunk/client
  • data-model/server:[根目录链接]/data-model/trunk/server
  • bin-module-1:[根目录链接]/bin-module-1/trunk
  • bin-module-2:[根目录链接]/bin-module-2/trunk

为此,我需要在data-modelbin-module-1bin-module-2pom.xml文件中添加一个scm部分。

我尝试了以下代码(用于data-model):

<scm>
    <connection>./data-model/trunk</connection>
    <developerConnection>./sdr/trunk</developerConnection>
    <url>./sdr/trunk</url
</scm>

或者

<scm>
    <connection>${project.parent.scm.connection}/data-model/trunk</connection>
    <developerConnection>${project.parent.scm.developerConnection}/data-model/trunk</developerConnection>
    <url>${project.parent.scm.url}/data-model/trunk</url>
</scm>

但是似乎都不起作用。属性${...}甚至没有被替换。 那么,我该如何覆盖相对于其父SCM URL的SCM路径? 任何帮助和建议将不胜感激。 提前致谢, Raphael
1个回答

5

我本以为这个可以工作:

<scm>
    <connection>${project.parent.scm.connection}/data-model/trunk</connection>
    <developerConnection>${project.parent.scm.developerConnection}/data-model/trunk</developerConnection>
    <url>${project.parent.scm.url}/data-model/trunk</url>
</scm>

如果没有,仍然可以通过编程方式分配这些值(我将使用 GMaven 进行操作,但您也可以使用 antrun 插件或编写自定义插件)
首先,设置一个属性。
<properties>
    <relativeScmPath>data-model/trunk</relativeScmPath>
</properties>

然后为所有SCM属性分配相对偏移量:
<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.3</version>
    <executions>
        <execution>
            <id>assign-scm</id>
            <phase>validate</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <source>
                <![CDATA[
                def parentScm = project.parent.scm;
                def thisScm = project.scm;
                def relPath = project.properties['relativeScmPath'];
                ['connection','developerConnection','url'].each{
                    thisScm[it] = parentScm[it] + relPath;
                }
                ]]>
                </source>
            </configuration>
        </execution>
    </executions>
</plugin>

你可以将这个代码添加到根pom中,然后修改它,使其仅在找到该属性时运行,然后通过将该属性添加到子模块中,就可以自动设置n个子模块的值。

请注意,在 scm url 中使用变量可能会触发 maven-release-plugin 中的一个旧 bug。 - mglauche

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