Maven Release Plugin със Svn:Externals и многомодулен проект

Даден е следният примерен многомодулен проект:

  • aggr/pom.xml (Версия 1.0-МОМЕНТНА СНИМКА)
  • aggr/parent/pom.xml (Версия 2.0-МОМЕНТНА СНИМКА)
  • aggr/app/pom.xml (Версия 3.0-МОМЕНТНА СНИМКА)
  • aggr/comp1/pom.xml (Версия 4.0-МОМЕНТНА СНИМКА)

където родителят е родителят на всеки друг pom и приложението има зависимост от comp1.

Освобождаването чрез release:prepare/perform просто работи добре, докато папката aggr има същата структура в svn хранилището (repository/trunk/aggr/parent.pom, ...).

Сега, когато искам да използвам същия проект, но със svn:externals, приставката за освобождаване не работи, заявявайки, че comp1:

Can't release project due to non released dependencies : parent:pom:2.0-SNAPSHOT

Тогава структурата на хранилището е нещо подобно

  • хранилище/aggr/trunk/pom.xml
  • repository/parent/trunk/pom.xml
  • repository/app/trunk/pom.xml
  • repository/comp1/trunk/pom.xml

папката aggr използва външни елементи, сочещи към модулните стволове и следователно извлеченото работно копие изглежда като горното.

Защо Maven обработва модули, базирани на външни елементи, по различен начин и има ли начин това да се преодолее?

Редактиране: pom-файловете на проекта svn:externals. Единствената разлика с pom-файловете на другия проект са scm таговете. В другия проект, който не е външен, само агрегаторът има етикет scm.

Външен родител-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-МОМЕНТНА СНИМКА

<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>

Външен app-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>

Thanks Konrad


person Konrd    schedule 30.04.2013    source източник
comment
Основният проблем, който имате, е, че не използвате една и съща версия за всички модули и т.н. Освен това можете ли да покажете pom файловете? Отделно от това, защо използвате външни елементи, за да създадете многомодулна структура, а не създавате истинска без външни елементи?   -  person khmarbaise    schedule 30.04.2013
comment
Модулите и родителят на реалния проект се използват в няколко проекта. Следователно трябва да разчитам на външни и не мога да използвам една и съща версия за целия проект.   -  person Konrd    schedule 30.04.2013
comment
Това всъщност не е причина, защото ако имате многомодулна компилация, можете да използвате модулите отделно. Така че, ако не промените структурата на папките в едно SVN дърво, вместо да използвате външни, няма да го стартирате.   -  person khmarbaise    schedule 04.06.2013


Отговори (1)


В текущия си проект трябва да стартирате mvn:release за всеки един, защото имате проекти или модули в различни svn хранилища. Ако искате да стартирате само един mvn:release, вашето хранилище трябва да изглежда така:

svn_repository: branches/
            tags/
            trunk/
                  parent
                  comp1
                  comp2
                  app
                  pom.xml
person Eddú Meléndez    schedule 28.10.2013
comment
Точно това правя. Благодаря! Знаете ли дали съществува плъгин, който автоматично извиква release:prepare за всички подмодули в правилния ред? - person Konrd; 01.11.2013
comment
В случай, че проблемът ви е във фазата на натискане, тъй като 2.0 те добавиха свойство „DcommitByProject“, което може да ангажира всеки проект, така че подмодулите работят. Изпълнявам тази команда на root и подмодулите работят добре mvn release:prepare -DcommitByProject=true - person le0diaz; 14.03.2019