反应堆根的Maven变量

Sea*_*oyd 47 maven-2

在多模块maven项目中,是否有一个指向根项目文件夹的变量?

  • ${project.basedir} 指向当前项目的目录,
  • ${project.parent.basedir} 指向父项目的目录,

但是有一个变量总是指向根目录(执行maven命令的目录),无论反应堆内的哪个项目?


我意识到我想要解决的问题几乎无法解决.我想要一个指向project.basedir,project.parent.basedir,project.parent.parent.basedir等的变量,以较高者为准.但是由于项目的父pom不一定是文件系统中的父项,我的整个方法都无济于事.所以我接受Pascal的答案,因为它回答了我的问题(即使我的问题没有解决我的问题).

Pas*_*ent 41

是否有一个始终指向根目录的变量(执行maven命令的目录)

user.dir (工作目录)应该是该目录.


ctr*_*den 21

在Maven 3中," ${session.executionRootDirectory}是一个始终指向...目录...的变量,执行maven命令."

请注意,这与提供多模块项目的顶级根目录的属性不同,无论目录结构在何处mvn执行.据我所知,这样的属性并不存在,但你可以使用${basedir}/..hack来实现它.有关详细信息,请参阅maven-users上的此主题.

另请参阅:查找多模块maven reactor项目的根目录


Mat*_*fek 16

在最新的maven中,您可以使用${maven.multiModuleProjectDirectory}.

  • 如果多模块项目的根目录中存在“.mvn”目录(可能为空),则此方法 100% 有效(同样,对于 3.6.3) (3认同)
  • 对于 Maven 3.6.3,我确定,通过在子模块 pom.xml 中配置的插件目标,这将引用运行 maven 的模块目录。如果从子模块目录在开发中运行,它不会像人们希望的那样“向上引用”。然而,这对于大多数目的来说已经足够了。 (2认同)

小智 7

使用directory-maven-plugin 和 directory-of 目标

与其他建议不同:

  • 此解决方案适用于多模块项目。
  • 无论您构建整个项目还是子模块,它都有效
  • 无论您是从根文件夹还是子模块运行 maven(与 ${session.executionRootDirectory}
  • 无需在每个子模块中设置相对路径属性!

该插件允许您将您选择的属性设置为任何项目模块的绝对路径。就我而言,我将其设置为根模块...在我的项目根 pom 中:

 <plugin>
    <groupId>org.commonjava.maven.plugins</groupId>
    <artifactId>directory-maven-plugin</artifactId>
    <version>0.1</version>
    <executions>
        <execution>
            <id>directories</id>
            <goals>
                <goal>directory-of</goal>
            </goals>
            <phase>initialize</phase>
            <configuration>
                <property>myproject.basedir</property>
                <project>
                    <groupId>com.my.domain</groupId>
                    <artifactId>my-root-artifact</artifactId>
                </project>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

从此以后,${myproject.basedir}在任何子模块中,pom 总是有项目根模块的路径。当然,您可以将属性设置为任何模块,而不仅仅是根...


And*_*ejs 5

可以使用以下命令创建此类属性:directory-maven-plugin。使用插件的highest-basedir目标,您可以将根路径分配给您指定的任何属性。


Mik*_*iuk 5

对我来说,在变量插值期间需要根目录,而不是插件部分 - 相对于带有手工制作的 jar 的根目录的本地目录。我知道在本地目录中放置 jar 是一种不好的做法,但这是项目的要求。

为什么我无法使用不同的解决方案:

因此,在我的需求不好的情况下,我使用了引用项目根的环境变量并在 pom.xml 中使用了它。当其他解决方案不起作用时,将其作为最后的手段。这是我在案例中如何使用环境变量的示例:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <!--NOTE: export PROJECT_ROOT=<location>-->
        <url>file:///${env.PROJECT_ROOT}/local-repo</url>
    </repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)