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

时间:2011-02-02 14:50:08

标签: version-control maven-2 maven

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

短篇小说

如何在POM文件的scm属性中指定相对于其父级的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
  • 数据模型/客户端:[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 bin-module-1 bin-module-2

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

<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路径?

非常感谢任何帮助,建议。

提前致谢, 圣拉斐尔

1 个答案:

答案 0 :(得分: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个子模块的值。