在多模块设置中使用maven $ {basedir}

时间:2011-05-19 16:06:22

标签: maven maven-2

我正在使用Maven: add a dependency to a jar by relative path中描述的本地存储库。

repository-url在最顶层的pom.xml中定义为

<url>file:${basedir}/../3rdParty/maven-repository</url>

此外,最顶层的pom.xml定义了2个模块

<modules>
    <module>sub1</module>
    <module>sub2</module>
</modules>

问题是,如果模块(比如sub1)定义了应该从存储库下载的依赖项,并且从最顶层的目录调用了maven,那么${basedir}就不会设置为目录,但sub1,导致存储库URL错误。

所以,假设最顶层pom.xml的项目位于

/Development/myproject/pom.xml

存储库位于

/Development/3rdParty/maven-repository

然后,存储库URL应设置为

/Development/myproject/../3rdParty/maven-repository

但事实证明它已设置为

/Development/myproject/sub1/../3rdParty/maven-repository

当然不存在。

知道为什么会这样吗?

4 个答案:

答案 0 :(得分:23)

虽然在你的情况下很烦人,但这是众所周知且有意的。 maven项目应该只知道它的执行目录,无论它在什么上下文中执行。

我几乎问了同样的问题:Maven variable for reactor root之前,唯一有意义的答案是to use ${user.dir},虽然它很笨拙,如果从模块目录构建,它将不起作用。

(还有这个非常详细的解决方案:Maven2 property that indicates the parent directory

答案 1 :(得分:3)

多个回购怎么样?

<repositories>
    <repository>
        <id>ibm-jars-bundle-lv0</id>
        <url>file://${basedir}/ibm-jars-bundle/repo</url>
    </repository>
    <repository>
        <id>ibm-jars-bundle-lv1</id>
        <url>file://${basedir}/../ibm-jars-bundle/repo</url>
    </repository>
    <repository>
        <id>ibm-jars-bundle-lv2</id>
        <url>file://${basedir}/../../ibm-jars-bundle/repo</url>
    </repository>
</repositories>

答案 2 :(得分:2)

关于父项目的目录,我已经问了一个类似的问题。

您可以在此处查看该主题:Maven2 property that indicates the parent directory

答案 3 :(得分:1)

您可以使用这个不错的插件确定模块的根目录:

    <plugin>
        <groupId>org.commonjava.maven.plugins</groupId>
        <artifactId>directory-maven-plugin</artifactId>
        <version>0.3.1</version>
        <executions>
            <execution>
                <id>directories</id>
                <goals>
                    <goal>directory-of</goal>
                </goals>
                <phase>initialize</phase>
                <configuration>
                    <property>maven-parent.basedir</property>
                    <project>
                        <groupId>my.group</groupId>
                        <artifactId>maven-parent</artifactId>
                    </project>
                </configuration>
            </execution>
        </executions>
    </plugin>

像这样使用目录:${maven-parent.basedir}