如何在儿童模块pom中获得超级pom基础?

时间:2012-01-02 11:08:46

标签: maven maven-2

我想在maven项目中定义一个本地存储库。

我有一个超级pom和几个子模块。我的文件结构是:

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

在我的超级pom中我定义:

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

问题是,在我的孩子pom中,我的超级pom中定义的存储库引用/ root / child / repository,因此无法找到依赖项...

有没有办法定义一条总是相对于超级pom的路径?

如果没有,解决问题的最佳方法是什么?

5 个答案:

答案 0 :(得分:4)

在这种情况下,首先您可以尝试${project.parent.basedir} 由于它似乎不起作用,简单(和本机)方式是使用完整路径(/ root / ...)或尝试相对路径(../)而不是使用$ {basedir}变量。

但对我来说,一个很好的解决方案是将此配置外部化为属性文件 您可以使用 properties-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>

答案 1 :(得分:3)

${project.parent.basedir}应该完成这项工作。

或者您可以在属性中设置根的basedir-path,因此它将被继承。父母那样的东西

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

在孩子身上

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

答案 2 :(得分:0)

我用groovy插件解决了很多次。将一个名为“basepath_marker”的文件添加到您的super pom目录中,并将以下内容添加到您的pom中。您可以像这样访问该属性:$ {base-path}。请阅读this blog post了解详情。

示例:

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

答案 3 :(得分:0)

我尝试在子pom中使用${basedir}/../,它有效。
${project.parent.basedir} 无法解释。
同样,以下解决方案也不起作用,似乎${basedir}是动态确定的。

  1. 在父pom中定义属性<rootPath> ${basedir} </rootPath>
  2. 在孩子的pom中使用${rootPath}

答案 4 :(得分:0)

在父 pom 中 - 尝试使用相对路径 (../) 而不是使用 ${basedir}