相对于POM中的父SCM URL的SCM URL

Rap*_*vet 6 version-control maven-2 maven

我有一个由几个模块和子模块组成的Maven项目.我使用SVN来版本化源文件.

短篇小说

如何在POM文件的scm属性中指定URL,这些属性与其父级的URL相关.

长话故事

一些模块及其子模块共享一个共同的版本号/发布过程,一些模块使用独立的模块/发布过程.对于具有独立版本号的模块,我已经设置了分支/主干/标签布局,让发布插件很开心.

为此,我在我的存储库中有两个SVN布局.一个包含所有主干/分支/标签混乱,另一个包含一个干净的准备结帐工作目录,其中包含svn:对中继的外部引用.

这看起来像这样; 你有真实世界的SVN布局,主干/分支/标签混乱:

  • pom.xml(主要父母)
  • utils的
    • 分支机构
    • 标签
    • 树干
      • pom.xml,src,target等...
  • 数据模型(已发布)
    • 分支机构
    • 标签
    • 树干
      • 的pom.xml
      • LIB
        • pom.xml,src,target等...
      • 服务器
        • pom.xml,src,target等...
      • 客户
        • pom.xml,src,target等...
  • 斌模块
    • bin-module-1(已发布)
      • 分支机构
      • 标签
      • 树干
        • pom.xml,src,target等...
    • bin-module-2(已发布)
      • 分支机构
      • 标签
      • 树干
        • pom.xml,src,target等...

工作区的干净布局,用"svn:externals"标签隐藏树枝/树干的东西:

  • pom.xml(主要父母)
  • utils( - > utils/trunk)
    • pom.xml,src,target等...
  • 数据模型( - > 数据模型/主干)
    • 的pom.xml
      • LIB
        • pom.xml,src,target等...
      • 服务器
        • pom.xml,src,target等...
      • 客户
        • pom.xml,src,target等...
  • 斌模块
    • 的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网址:

  • root:[root-url]
  • utils:[root-url]/utils
  • 数据模型:[root-url]/data-model /
  • data-model/lib:[root-url]/data-model/lib
  • 数据模型/客户端:[root-url]/data-model/client
  • 数据模型/服务器:[root-url]/data-model/server
  • bin-module-1:[root-url]/bin-module-1 /
  • bin-module-2:[root-url]/bin-module-2 /

但Maven并不知道实际的SVN布局.我希望看到:

  • root:[root-url]
  • utils:[root-url]/utils/trunk
  • 数据模型:[root-url]/data-model/trunk
  • data-model/lib:[root-url]/data-model/trunk/lib
  • data-model/client:[root-url]/data-model/trunk/client
  • 数据模型/服务器:[root-url]/data-model/trunk/server
  • bin-module-1:[root-url]/bin-module-1/trunk
  • bin-module-2:[root-url]/bin-module-2/trunk

对于这一点,我需要将添加SCM部到pom.xml数据模型,仓模块-1仓模块-2 .

我尝试过(对于数据模型):

<scm>
    <connection>./data-model/trunk</connection>
    <developerConnection>./sdr/trunk</developerConnection>
    <url>./sdr/trunk</url
</scm>
Run Code Online (Sandbox Code Playgroud)

要么

<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>
Run Code Online (Sandbox Code Playgroud)

但似乎都没有效果.甚至没有替换$ {...}属性.那么,如何相对于其父SCM URL覆盖SCM路径?

任何帮助,建议,将不胜感激.

拉斐尔提前谢谢

Sea*_*oyd 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>
Run Code Online (Sandbox Code Playgroud)

如果没有,仍然有可能以编程方式分配这些值(我将使用GMaven来做到这一点,但你也可以使用antrun插件或编写自定义插件)

首先,设置一个属性

<properties>
    <relativeScmPath>data-model/trunk</relativeScmPath>
</properties>
Run Code Online (Sandbox Code Playgroud)

然后为所有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>
Run Code Online (Sandbox Code Playgroud)

您可以将其添加到根pom并进行更改,使其仅在找到属性时运行,然后您可以通过简单地向其添加属性来自动设置n个子模块的值.