Построить дочерний модуль без создания родительского модуля, когда версии всех модулей управляются одним свойством

У меня есть многомодульный проект с иерархией ниже:

parent-build проект pom.xml

...
    <groupId>com.my.project</groupId>
    <artifactId>parent-build</artifactId>
    <packaging>pom</packaging>
    <name>parent-build</name>
    <version>${version.product}</version>
    <properties>
        <version.product>1.0</version.product>
    </properties>
    ...

build-all проект pom.xml

...
    <parent>
        <artifactId>parent-build</artifactId>
        <groupId>com.my.project</groupId>
        <version>${version.product}</version>
        <relativePath>../parent-build/pom.xml</relativePath>
    </parent>
    <groupId>com.my.project</groupId>
    <packaging>pom</packaging>
    <modules>
        <module>../child-1</module>
        <module>../child-2</module>
    </modules>
    ...

child-2 проект pom.xml

...
    <parent>
        <artifactId>parent-build</artifactId>
        <groupId>com.my.project</groupId>
        <version>${version.product}</version>
        <relativePath>../parent-build/pom.xml</relativePath>
    </parent>
    <groupId>com.my.project</groupId>
    <artifactId>child-2</artifactId>
    <packaging>jar</packaging>
    <version>${version.product}</version>
    ...
    <dependencies>
        <dependency>
            <groupId>com.my.project</groupId>
            <artifactId>child-1</artifactId>
            <version>${version.product}</version>
        </dependency>
        ...
    </dependencies>
    ...

child-1 проект pom.xml

...
    <parent>
        <artifactId>parent-build</artifactId>
        <groupId>com.my.project</groupId>
        <version>${version.product}</version>
        <relativePath>../parent-build/pom.xml</relativePath>
    </parent>
    <groupId>com.my.project</groupId>
    <artifactId>child-1</artifactId>
    <packaging>jar</packaging>
    <version>${version.product}</version>
    ...

Я хочу собрать все банки с одинаковой версией, и эта версия должна быть указана в одном месте. Я объявил свойство в родительской сборке pom.xml

Теперь, когда я делаю mvn clean install в проекте build-all, он строит все проекты в указанном порядке модулей. Это нормально.

Но в некоторых случаях я хочу построить только проект child-2.

то есть, скажем, я делаю некоторые изменения в проекте child-2 и хочу построить только этот проект. Проблема с этим сценарием в том, что он не может найти значение свойства version.product

Редактировать:

Ниже приведена ошибка, которую я получаю при создании проекта child-2.

Could not transfer artifact com.my.project:parent-build:pom:${version.product} from/to central (http://repo1.maven.org/maven2): Illegal character in path at index 66: http://repo1.maven.org/maven2/com/my/project/parent-build/${version.product}/parent-build-${version.product}.pom

Пожалуйста помоги.

Заранее спасибо.


person akash777.sharma    schedule 18.01.2017    source источник
comment
Я считаю, что дочерние модули автоматически наследуют версию своего родителя, поэтому вам не нужно явно объявлять это.   -  person Luciano van der Veekens    schedule 18.01.2017
comment
Как уже упоминалось luc14n0, версия родителя наследуется. Таким образом, единственное место, где вам нужно написать явную версию, — это родительский элемент. В самом детях вы должны опустить это. Кроме того, структура вашего pom показывает, что вы не следовали структуре в своих каталогах .... это должно быть исправлено, потому что это упростит файл pom ... вы можете удалить элементы относительный путь, и вы можете упростить такие вещи, как <module>../child1</module> в <module>child1</module> .. Если вы хотите построить дочерний элемент в одиночку, вы можете вызвать maven через mvn -pl child1 из корня.   -  person khmarbaise    schedule 18.01.2017
comment
Свойство version.product выбирается maven, когда я запускаю проект build-all. Но когда я создаю child-2, он не может найти папку version.product. Также я пропустил версии из самого дочернего pom. Мой реальный сценарий отличается и имеет около 25 дочерних проектов. Структура папок и относительные пути в моем проекте верны. Упомянутые проекты являются лишь копией, чтобы показать проблему.   -  person akash777.sharma    schedule 18.01.2017


Ответы (2)


Во-первых, я бы выступил против этого, но я знаю, что у вас может быть модуль, который еще не работает должным образом и т. д. В прошлом я использовал профили в родительском pom для управления списком модулей:

<profiles>
    <profile>
        <id>all</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <modules>
            <module>1</module>
            <module>2</module>
            <module>3</module>
            <module>4</module>
        </modules>
    </profile>
    <profile>
        <id>profile1</id>
        <modules>
            <module>1</module>
            <module>2</module>
            <module>3</module>
        </modules>
    </profile>
</profiles>

тогда для:

1) mvn clean install - вы получите все модули

2) mvn clean install -Pprofile1 вы получите только модули 1,2 и 3.

person Essex Boy    schedule 18.01.2017
comment
Согласно вашему решению, мое требование состоит в том, чтобы построить только ребенка-3. Я не хочу перестраивать ребенка-1 и ребенка-2. Поскольку их банки уже находятся в каталоге m2. - person akash777.sharma; 18.01.2017
comment
@ akash777.sharma Думаю, ты хочешь сказать, что это именно то, что тебе нужно? Я был бы осторожен, используя это как нечто большее, чем временное решение. Если дети не являются частью этого родителя, возможно, разделите их на отдельный родитель. - person Essex Boy; 18.01.2017

flatten-maven-plugin

Это то, чего я хочу.

Этот плагин заменит вашу версию, указанную в свойстве, фактическим значением свойства во всех действующих pom.xml.

Поэтому позже, если вы создадите какой-либо дочерний элемент отдельно, он будет успешно построен.

Ваше здоровье

person akash777.sharma    schedule 18.01.2017