Solución:
usar ${session.executionRootDirectory}
Para el registro, ${session.executionRootDirectory}
funciona para mí en archivos pom en Maven 3.0.3. Esa propiedad será el directorio en el que se está ejecutando, así que ejecute el proyecto principal y cada módulo puede obtener la ruta a ese directorio raíz.
Puse la configuración del complemento que usa esta propiedad en el pom principal para que se herede. Lo uso en un perfil que solo selecciono cuando sé que voy a ejecutar Maven en el proyecto principal. De esta manera, es menos probable que use esta variable de una manera no deseada cuando ejecuto Maven en un proyecto secundario (porque entonces la variable no sería la ruta al padre).
Por ejemplo,
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-artifact</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>${project.packaging}</type>
</artifactItem>
</artifactItems>
<outputDirectory>${session.executionRootDirectory}/target/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Desde Maven 3.3.1, puede usar ${maven.multiModuleProjectDirectory}
para este propósito. (gracias a https://stackoverflow.com/a/48879554/302789)
editar: parece que esto solo funciona correctamente cuando tienes un .mvn
carpeta en la raíz de su proyecto.
Algo que he usado en mis proyectos es anular la propiedad en el submódulo poms.
root: <myproject.root>${basedir}</myproject.root>
moduleA: <myproject.root>${basedir}/..</myproject.root>
other/moduleX: <myproject.root>${basedir}/../..</myproject.root>
De esta manera, todavía tiene las rutas relativas, pero puede definir un complemento una vez en el módulo raíz, y sus módulos lo heredarán con la sustitución correcta de myproject.root.