Родительские свойства внутри плагина maven antrun - PullRequest
6 голосов
/ 28 октября 2010

Есть многомодульный проект.Внутри ребенка мне нужно сделать несколько сложных вещей (интеграционный тест с развертыванием на сервере приложений и т. Д.).Таким образом, есть дочерний объект тестирования интеграции, и из этого модуля мне нужен корень родителя для доступа к другим модулям.Я не хочу использовать "..".В интеграционном тесте POM есть свойство:

<properties>
 <main.basedir>${project.parent.basedir}</main.basedir>
    ...
</properties>

И есть плагин antrun со следующим содержанием:

<plugins>
 <plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
   <execution>
    <id>render-parameter-sql</id>
    <phase>validate</phase>
    <goals>
     <goal>run</goal>
    </goals>
    <configuration>
     <tasks>
      <echoproperties/>
     </tasks>
    </configuration>
   </execution>
  </executions>
 </plugin>
</plugins>

В выводе main.basedir не разрешен:

main:
[echoproperties] #Ant properties
[echoproperties] #Thu Oct 28 09:32:13 CEST 2010
[echoproperties] ant.core.lib=C\:\\Users\\gaborl\\.m2\\repository\\org\\apache\\ant\\ant\\1.8.1\\ant-1.8.1.jar
...
[echoproperties] main.basedir=${project.parent.basedir}
[echoproperties] maven.dependency.antlr.antlr.jar.path=C\:\\Users\\gaborl\\.m2\\repository\\antlr\\antlr\\2.7.6\\antlr-2.7.6.jar

Разозлившись, я решил спросить, как обойти это ...

1 Ответ

11 голосов
/ 29 октября 2010

Я не знаю точно , почему ${project.parent.basedir} не "доступен" от AntRun, возможно, он просто не поддерживается (см. http://jira.codehaus.org/browse/MNG-3597).

Вот ужасный обходной путь, использующийgmaven:

<plugin>
  <groupId>org.codehaus.gmaven</groupId>
  <artifactId>gmaven-plugin</artifactId>
  <version>1.3</version>
  <executions>
    <execution>
      <id>set-custom-property</id>
      <phase>validate</phase>
      <goals>
        <goal>execute</goal>
      </goals>
      <configuration>
        <source>
          project.properties.setProperty('main.basedir', project.parent.basedir.toString())
        </source>
      </configuration>
    </execution>
  </executions>
</plugin>
<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.6</version>
  <executions>
    <execution>
      <id>render-parameter-sql</id>
      <phase>validate</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <target>
          <echo>project.artifactId        : ${project.artifactId}</echo>
          <echo>project.parent.basedir    : ${project.parent.basedir}</echo>
          <echo>main.basedir              : ${main.basedir}</echo>
          <echo>project.basedir           : ${project.basedir}</echo>
          <echo>project.build.directory   : ${project.build.directory}</echo>
        </target>
      </configuration>
    </execution>
  </executions>
</plugin>

Я не горжусь этим, но это вроде "работает" (если вам подходит строковое представление пути к родительскому basedir):

$ mvn validate
[INFO] Scanning for projects...
...
[INFO] --- maven-antrun-plugin:1.6:run (render-parameter-sql) @ Q4040778 ---
[INFO] Executing tasks

main:
     [echo] project.artifactId        : Q4040778
     [echo] project.parent.basedir    : ${project.parent.basedir}
     <b>[echo] main.basedir              : /home/pascal/Projects/stackoverflow</b>
     [echo] project.basedir           : /home/pascal/Projects/stackoverflow/Q4040778
     [echo] project.build.directory   : /home/pascal/Projects/stackoverflow/Q4040778/target
[INFO] Executed tasks
...

Но я должен сказать, что то, что вы хотите сделать ( из этого модуля, мне нужен корень родителя для доступа к другим модулям ) - это плохая практика , модули должны быть самостоятельнымисодержится и не тесно связан.

Я не рекомендую использовать то, что я написал:)

...