Свойства Maven в многомодульном проекте сбрасываются по умолчанию - PullRequest
5 голосов
/ 29 сентября 2011

У меня есть вопрос, касающийся свойств в многомодульном проекте.

Рассмотрим следующую трехуровневую структуру проекта:

project
+- pom.xml (packaging: pom)        //referred to as super-pom
+- module_group
   +- pom.xml (packaging: pom)     //referred to as group-pom
   +- module
      +-pom.xml (packaging: jar)   //referred to as module-pom

В супер-поме я определяю свойство revision , которая получает значение по умолчанию "unknown".

Дополнительно я объявляю и использую buildnumber-maven-plugin, настроенный для получения ревизии svn и помещения ее в свойство revision .

Далее я настраиваю maven-jar-plugin для записи этого свойства в манифест.

В th-модуле я объявляю использование buildnumber-maven-plugin, чтобы оно действительно выполнялось.


Все это работает при непосредственном построении модуля, т.е. при выполнении только модуля-пом.Манифест содержит ревизию, сообщаемую buildnumber-maven-plugin, как указано в консоли.

Однако, если я выполняю супер-помпу или групповую помпу, значение по умолчанию для ревизия записывается в манифест, хотя buildnumber-maven-plugin выполняется и получает правильную ревизию (печатает ее на консоли до запуска maven-jar-plugin).

Итак, у меня естьощущение, что я что-то упускаю в наследовании свойств в многомодульных проектах.

У кого-нибудь есть идеи, что тут может быть не так?Или кто-нибудь может указать мне на описание того, как на самом деле обрабатываются свойства в этих случаях (к сожалению, я пока не смог найти хорошее описание)?

Обновление

Я провел некоторое исследование и несколько тестовых прогонов с выводом отладки (опция -X), и из того, что я нашел до сих пор, я предполагаю, что моя проблема заключается в следующем:

1) Во время синтаксического анализа свойств, используемых впом заменены их значения.

Рассмотрим этот частичный pom:

<!-- declare the property default value -->
<properties>
  <revision>default</revision>
</properties>

...

<!-- use the property -->
<someconfig>${revision}</someconfig>

После того, как pom оценен, создается впечатление, что оно соответствует состоянию:

<properties>
  <revision>default</revision>
</properties>

...

<!-- The property seems to be "statically" replaced -->
<someconfig>default</someconfig>

2)Плагин, который устанавливает фактическое значение свойства, запускается впоследствии, даже если на этапе validate.

Таким образом, само свойство правильно установлено на новое значение, но оно больше не читается.

3) Плагин, который использует <someconfig> (в моем случае это будет maven-jar-plugin), теперь работает с <someconfig>default</someconfig> и, таким образом, он вообще не читает revision.

Может кто-нибудь подтвердитьэто?

1 Ответ

0 голосов
/ 21 февраля 2012

Я могу только сказать, что объявление buildnumber-maven-plugin и maven-jar-plugin в супер-помпе хорошо для меня, независимо от того, групповая ли это сборка или целевая.

Вотчасть этого супер-помпа (родитель для всех проектов):

        <!-- Generate build number -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.0</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>create</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <doCheck>false</doCheck>
                <doUpdate>false</doUpdate>
            </configuration>
        </plugin>
        <!-- Attach build number to all jars -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <archive>
                    <manifest>
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                    </manifest>
                    <manifestEntries>
                        <Implementation-Build>${buildNumber}</Implementation-Build>
                        <Implementation-Build-Timestamp>${maven.build.timestamp}</Implementation-Build-Timestamp>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
...