首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >maven ${basedir}在多模块设置中的用法

maven ${basedir}在多模块设置中的用法
EN

Stack Overflow用户
提问于 2011-05-20 00:06:22
回答 3查看 89.4K关注 0票数 42

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

在最顶层的pom.xml中,存储库url定义为

代码语言:javascript
复制
<url>file:${basedir}/../3rdParty/maven-repository</url>

此外,最上面的pom.xml定义了2个模块

代码语言:javascript
复制
<modules>
    <module>sub1</module>
    <module>sub2</module>
</modules>

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

因此,假设具有最高pom.xml的项目驻留在

代码语言:javascript
复制
/Development/myproject/pom.xml

而存储库在

代码语言:javascript
复制
/Development/3rdParty/maven-repository

则应将存储库URL设置为

代码语言:javascript
复制
/Development/myproject/../3rdParty/maven-repository

但事实证明它被设置为

代码语言:javascript
复制
/Development/myproject/sub1/../3rdParty/maven-repository

当然这并不存在。

你知道为什么会这样吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-20 00:14:07

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

我之前问过几乎相同的问题:Maven variable for reactor root,唯一有意义的答案是to use ${user.dir},尽管它很老套,而且如果您从模块目录构建,它将无法工作。

(还有一个非常冗长的解决方案:Maven2 property that indicates the parent directory)

票数 24
EN

Stack Overflow用户

发布于 2014-09-11 23:30:04

如果有多个repos呢?

代码语言:javascript
复制
<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>
票数 3
EN

Stack Overflow用户

发布于 2021-02-18 12:54:02

你可以用这个插件来确定一个模块的根目录:

代码语言:javascript
复制
    <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}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6061537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档