如何在子模块的pom文件中获取基于super pom的basedir路径?

15

我想在我的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定义路径?

如果没有,最好的解决方法是什么?


所以你想要为每个项目创建一个存储库?也许${project.parent.relativePath}是可解析的(此外,您必须在所有子POM中定义<relativePath>)。 - dma_k
5个回答

5
在这种情况下,首先你可以尝试使用${project.parent.basedir}
但似乎不起作用,简单(并且本地的)方法是使用完整路径(/root/...)或尝试相对路径(../)代替使用${basedir}变量。
但对我来说,一个很好的解决方案是将此配置外部化到属性文件中。
您可以使用properties-maven-pluginhttp://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>

3

${project.parent.basedir}应该可以胜任。

或者您可以将根目录的basedir路径设置为属性,这样它会被继承。在父级中添加以下内容:

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

并且在Child组件中

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

4
感谢您的回复,但是父POM中的${basedir}不会运行,因为它被子POM路径替换了,而${project.parent.basedir}也没有被解释。 - Jerome Cance
3
属性首先从父级合并,然后进行处理。 - dma_k

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

0

我在子POM中尝试使用${basedir}/../,并且它可以正常工作。
${project.parent.basedir}无法解释。
此外,以下解决方案不起作用,似乎${basedir}是动态决定的。

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

0
我曾经用Groovy插件多次解决这个问题。在你的超级POM目录下添加一个名为“basepath_marker”的文件,并将以下内容添加到你的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>
 ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接