Подтвердить что ты не робот

Как получить супер pom basedir в дочернем модуле pom?

Я хочу определить локальный репозиторий в моем проекте maven.

У меня есть супер-пом и несколько дочерних модулей. Моя файловая структура:

/root
    /repository
    /child
        pom.xml
    pom.xml

в моем супер помпе я определяю:

<repository>
    <id>my-local-repo</id>
    <url>file://${basedir}/repository</url>
</repository>

Проблема в том, что в моем дочернем pom репозиторий, определенный в моем супер пом, ссылается на /root/child/repository, и поэтому зависимости не могут быть найдены...

Есть ли способ определить путь всегда относительно супер pom?

Если нет, то какой лучший способ решить проблему?

4b9b3361

Ответ 1

В этом случае сначала вы можете попробовать ${project.parent.basedir}.
Как кажется, это не сработает, простой (и собственный) способ - использовать полный путь (/root/...) или попробовать относительный путь (../) вместо переменной ${basedir}.

Но для меня отличное решение будет использовать эту конфигурацию в файле свойств. Вы можете использовать свойства-maven-plugin (http://mojo.codehaus.org/properties-maven-plugin/plugin-info.html).

С помощью этого плагина свойства, определенные в файле свойств, можно читать так же, как свойства, определенные внутри pom.xml.

С сайта плагина:

Если у вас есть файл свойств с именем teams.properties с этим контентом:

toronto=raptors
miami=heat

Было бы так же, как объявление следующего в вашем pom.xml:

<properties> 
  <toronto>raptors</toronto>
  <miami>heat</miami>
</properties>

Ответ 2

${project.parent.basedir} должен выполнить задание.

Или вы можете установить для root путь root в свойстве, поэтому он будет унаследован. Что-то вроде этого в родительском

<properties>
  <rootPath>${basedir}</rootPath>
</properties>

И в Ребенке

<repository>
  <id>my-local-repo</id>
  <url>file://${rootPath}/repository</url>
</repository>

Ответ 3

Я решил это много раз с помощью плагина groovy. Добавьте файл, называемый "basepath_marker", в ваш каталог супер pom и добавьте следующее к вашему pom. Вы можете получить доступ к этому свойству: ${base-path}. Подробнее читайте этот пост в блоге.

Пример:

 ...
 <build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>groovy-maven-plugin</artifactId>
            <executions>
                <!-- set absolute base path from super pom -->
                <execution>
                    <id>find-basepath</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>execute</goal>
                    </goals>
                    <configuration>
                        <source>
                            <![CDATA[
                                import java.io.File;
                                log.info('## define projects super pom absolute path through basepath_marker')
                                String p = "basepath_marker";
                                File f = null;
                                if( p != null ) {
                                    def _max_child_poms = 0
                                    while( _max_child_poms++ < 5 ) {
                                        f = new File( p );
                                        if( f.exists() ) {
                                            break;
                                        }   
                                        p = "../" + p;                                 
                                    }
                                }
                                if( f != null ) {
                                    String basePath = f.getCanonicalPath();
                                    basePath = basePath.substring( 0, basePath.lastIndexOf( File.separator ) ); 
                                    project.properties['base-path'] = basePath.replace( '\\' , '/');
                                    log.info(' - used base path = ' + project.properties['base-path'] );
                                } else {
                                    log.error( 'Could not find basepath_marker marker file!' );
                                    System.stop( 0 );
                                }
                            ]]>
                        </source>
                    </configuration>
                </execution>                    
            </executions>
        </plugin>
    </plugins>
</build>
 ...