2010-10-28 2 views
5

Существует многомодульный проект. Внутри ребенка мне нужно сделать некоторые сложные вещи (интеграционный тест с развертыванием на сервер приложений и т. Д.). Таким образом, существует дочерний элемент интеграции, и из этого модуля мне нужен корень родителя для доступа к другим модулям. Я не хочу использовать «..». Существует свойство в integrationtest POM:Родительские свойства внутри плагина maven antrun

<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 

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

ответ

9

Я не знаю точно Почему ${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} 
    [echo] main.basedir    : /home/pascal/Projects/stackoverflow 
    [echo] project.basedir   : /home/pascal/Projects/stackoverflow/Q4040778 
    [echo] project.build.directory : /home/pascal/Projects/stackoverflow/Q4040778/target 
[INFO] Executed tasks 
... 

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

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

+0

Да, это взлом, но работает. Спасибо Pascal –

+1

gmaven, да? ts, ts :-) (+1) –

Смежные вопросы