我想在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的路径?
如果没有,解决问题的最佳方法是什么?
答案 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}
是动态确定的。
<rootPath> ${basedir} </rootPath>
${rootPath}
答案 4 :(得分:0)
在父 pom 中 -
尝试使用相对路径 (../
) 而不是使用 ${basedir}