【问题标题】:Maven variable for reactor root反应堆根的 Maven 变量
【发布时间】:2011-05-07 23:51:02
【问题描述】:

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

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

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


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

【问题讨论】:

标签: maven-2


【解决方案1】:

使用directory-maven-plugin with directory-of goal

与其他建议不同:

  • 此解决方案适用于多模块项目。
  • 无论您构建整个项目还是子模块,它都可以工作
  • 无论您是从根文件夹还是子模块运行 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>

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

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

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

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

    • ${session.executionRootDirectory}${user.dir} 与执行 maven 命令的目录相关联。我想独立于启动 maven 的目录引用同一目录。
    • ${project.basedir},如上所述,指向当前项目目录,所以子模块会在错误的位置搜索jar。
    • 我有大约 100 个项目,因此在我的情况下,为this 问题定义相对路径或接受答案的使用非常复杂。
    • Directory plugin 只能用于插件配置,不能用于变量插值

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

    <repositories>
        <repository>
            <id>local-maven-repo</id>
            <!--NOTE: export PROJECT_ROOT=<location>-->
            <url>file:///${env.PROJECT_ROOT}/local-repo</url>
        </repository>
    </repositories>
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        请注意,这与提供多模块项目顶级根目录的属性不同,无论从目录结构中的哪个位置执行 mvn。据我所知,这样的属性不存在,但您可以使用${basedir}/.. hack 来实现它。详情请见this thread on maven-users

        另见:Finding the root directory of a multi module maven reactor project

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            据我所知,没有这样的变量。只有Maven2 property that indicates the parent directory 的接受答案中的解决方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-08-13
              • 2018-03-17
              • 1970-01-01
              • 2022-09-22
              • 1970-01-01
              • 2018-09-02
              • 1970-01-01
              相关资源
              最近更新 更多