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

tho*_*ers 38 maven-2 maven

我正在使用Maven中描述的本地存储库:通过相对路径向jar添加依赖项.

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

<url>file:${basedir}/../3rdParty/maven-repository</url>
Run Code Online (Sandbox Code Playgroud)

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

<modules>
    <module>sub1</module>
    <module>sub2</module>
</modules>
Run Code Online (Sandbox Code Playgroud)

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

所以,说最顶层的项目就pom.xml

/Development/myproject/pom.xml
Run Code Online (Sandbox Code Playgroud)

存储库在

/Development/3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)

然后应将存储库URL设置为

/Development/myproject/../3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)

但事实证明它被设定为

/Development/myproject/sub1/../3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)

这当然不存在.

知道为什么会这样吗?

Sea*_*oyd 24

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

我问了几乎相同的问题:反应堆root的Maven变量更早,唯一有意义的答案是使用${user.dir},虽然它很hacky,如果从模块目录构建,它将无法工作.

(还有这个非常详细的解决方案:Maven2属性,指示父目录)


Bor*_*ski 6

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

    <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>
Run Code Online (Sandbox Code Playgroud)

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