Frage

Es ist ein Multi-Modul-Projekt. Im Inneren des Kindes muss ich (mit der Bereitstellung auf Anwendungsserver und so weiter Integrationstest), einige komplizierte Dinge zu tun. So gibt es ein integrationtest Kind, und von diesem Modul muss ich die Wurzel des übergeordneten anderen Modulen zu erreichen. Ich will nicht verwenden „..“. Es ist eine Eigenschaft in integrationtest POM:

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

Und es gibt eine antrun Plugin mit folgendem Inhalt:

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

In der Ausgabe wird die main.basedir nicht aufgelöst:

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

Nach dem wirklich wütend, dass ich immer beschlossen, Sie fragen, wie diese umgehen ...

War es hilfreich?

Lösung

Ich weiß nicht, genau , warum die ${project.parent.basedir} nicht "verfügbar" von AntRun, vielleicht ist es einfach nicht unterstützt (siehe http://jira.codehaus.org/browse/MNG-3597 ).

Hier ist eine schreckliche Abhilfe mit 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>

Ich bin nicht stolz darauf, aber es irgendwie „funktioniert“ (wenn eine String-Darstellung des Wegs zum übergeordneten basedir ist ok für Sie):

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

Aber ich muss sagen, dass das, was Sie tun möchten ( von diesem Modul muss ich die Wurzel des übergeordneten anderen Modulen erreichen ) ist ein schlechte Praxis , Module sein sollte, eigenständig und nicht eng gekoppelt.

ich mit nicht empfehlen, was ich geschrieben:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top