使用Svn:Externals和多模块项目的Maven Release插件

6
给定以下示例多模块项目:
aggr/pom.xml(版本1.0-SNAPSHOT)
aggr/parent/pom.xml(版本2.0-SNAPSHOT)
aggr/app/pom.xml(版本3.0-SNAPSHOT)
aggr/comp1/pom.xml(版本4.0-SNAPSHOT)
其中,parent是任何其他pom的父级,而app依赖于comp1。
通过release:prepare/perform发布非常顺利,只要aggr文件夹在svn存储库中具有相同的结构(repository/trunk/aggr/parent.pom等)。
现在当我想使用具有svn:externals的相同项目时,发布插件不起作用,指出comp1:
“由于未发布的依赖项,无法发布项目:parent:pom:2.0-SNAPSHOT”
然后,存储库结构如下:
repository/aggr/trunk/pom.xml
repository/parent/trunk/pom.xml
repository/app/trunk/pom.xml
repository/comp1/trunk/pom.xml
aggr文件夹使用外部引用指向模块主干,因此检出的工作副本看起来像上面那样。
为什么Maven会根据外部引用处理模块,并且是否有办法克服这个问题?
编辑:svn:externals项目的pom文件。与其他项目的pom文件唯一的区别是scm标记。在其他非外部项目中,只有聚合器具有scm标记。
外部parent-pom.xml
<groupId>small.test</groupId>
<artifactId>parent</artifactId>
<version>2.0-SNAPSHOT</version>

<scm>
    <connection>scm:svn:http://localhost/svn/small-test-ext/parent/trunk/</connection>
    <developerConnection>scm:svn:http://localhost/svn/small-test-ext/parent/trunk/</developerConnection>
    <url>http://localhost/svn/small-test-ext/parent/trunk/</url>
</scm>

<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.4.1</version>
    </plugin>
</plugins>

外部aggr-pom.xml small.test 父项目 2.0-SNAPSHOT

<groupId>small.test</groupId>
<artifactId>aggr</artifactId>
<version>1.0-SNAPSHOT</version>

<scm>
    <connection>scm:svn:http://localhost/svn/small-test-ext/aggr/trunk/</connection>
    <developerConnection>scm:svn:http://localhost/svn/small-test-ext/aggr/trunk/</developerConnection>
    <url>http://localhost/svn/small-test-ext/aggr/trunk/</url>
</scm>

<modules>
    <module>parent</module>
    <module>comp1</module>
    <module>comp2</module>
    <module>app</module>
</modules>

外部应用程序-pom.xml

<parent>
    <groupId>small.test</groupId>
    <artifactId>parent</artifactId>
    <version>2.0-SNAPSHOT</version>
</parent>
<groupId>small.test</groupId>
<version>3.0-SNAPSHOT</version>

<artifactId>app</artifactId>
<packaging>jar</packaging>

<scm>
    <connection>scm:svn:http://localhost/svn/small-test-ext/app/trunk/</connection>
    <developerConnection>scm:svn:http://localhost/svn/small-test-ext/app/trunk/</developerConnection>
    <url>http://localhost/svn/small-test-ext/app/trunk/</url>
</scm>

<dependencies>  
    <dependency>
    <groupId>small.test</groupId>
    <artifactId>comp1</artifactId>
    <version>4.0-SNAPSHOT</version>
</dependency>

谢谢 Konrad


你主要的问题是没有为所有模块使用相同的版本。此外,你能展示POM文件吗?除此之外,为什么要使用外部依赖来创建多模块结构而不是创建一个真正的结构,而不需要外部依赖呢? - khmarbaise
实际项目的模块和父级正在多个项目中使用。因此,我必须依赖外部资源,不能在整个项目中使用相同的版本。 - Konrd
这并不是一个真正的理由,因为如果你有一个多模块构建,你可以单独使用这些模块。所以,如果你不把文件夹结构改成单个 SVN 树而是继续使用 externals,你就无法运行它。 - khmarbaise
1个回答

2
在您当前的项目中,由于您的项目或模块位于不同的svn存储库中,因此必须针对每个项目运行 mvn:release。如果您想运行单个mvn:release,则您的存储库应该如下所示:
svn_repository: branches/
            tags/
            trunk/
                  parent
                  comp1
                  comp2
                  app
                  pom.xml

2
这正是我正在做的事情。谢谢!你知道是否存在一个插件,可以按正确顺序自动调用release:prepare来处理所有子模块吗? - Konrd
如果您的问题出现在2.0版本的推送阶段,那么他们添加了一个名为“DcommitByProject”的属性,可以按项目提交,因此子模块可以正常工作。我在根目录上执行此命令,子模块可以正常工作: mvn release:prepare -DcommitByProject=true - le0diaz

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