Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parent properties inside maven antrun plugin

There is a multi-module project. Inside the child I need to do some complicated stuff (integration test with deploying to application server and so on). So there is an integrationtest child, and from this module I need the root of the parent to reach other modules. I do not want to use "..". There is a property in integrationtest POM:

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

And there is an antrun plugin with the following content:

<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 the output, the main.basedir is not resolved:

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

After becoming really angry I decided to ask you how to get around this...

like image 344
Gábor Lipták Avatar asked Oct 28 '10 07:10

Gábor Lipták


People also ask

What does Maven AntRun plugin do?

This plugin provides the ability to run Ant tasks from within Maven. You can even embed your Ant scripts in the POM! It is not the intention of this plugin to provide a means of polluting the POM, so it's encouraged to move all your Ant tasks to a build.

What is properties Maven plugin?

The Properties Maven Plugin is here to make life a little easier when dealing with properties. It provides goals to read properties from files and URLs and write properties to files, and also to set system properties. It's main use-case is loading properties from files or URLs instead of declaring them in pom.

How do I run an Ant script from Maven?

Action. Configure the run goal form the Maven AntRun plugin. Define any properties you wish to pass to the external Ant build, and then call the external Ant build with the ant task, specifying the antfile and target you wish to execute. To execute this external Ant build, run mvn package.


1 Answers

I don't know exactly why the ${project.parent.basedir} is not "available" from AntRun, maybe it's just not supported (see http://jira.codehaus.org/browse/MNG-3597).

Here is an horrible workaround using 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>

I'm not proud of it, but it kinda "works" (if a string representation of the path to the parent basedir is ok for you):

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

But I need to say that what you want to do (from this module I need the root of the parent to reach other modules) is a bad practice, modules should be self contained and not tightly coupled.

I do not recommend using what I posted :)

like image 69
Pascal Thivent Avatar answered Oct 16 '22 08:10

Pascal Thivent