Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven 2 反应堆根的Maven变量_Maven 2 - Fatal编程技术网

Maven 2 反应堆根的Maven变量

Maven 2 反应堆根的Maven变量,maven-2,Maven 2,在多模块maven项目中,是否存在指向根项目文件夹的变量 ${project.basedir}指向当前项目的目录 ${project.parent.basedir}指向父项目的目录 但是,是否有一个变量总是指向根目录(执行maven命令的根目录),而不管它来自反应堆中的哪个项目 我意识到我想解决的问题几乎无法解决。我想要一个指向project.basedir、project.parent.basedir、project.parent.parent.basedir等的变量,以较高者为准。但是

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

  • ${project.basedir}
    指向当前项目的目录
  • ${project.parent.basedir}
    指向父项目的目录
但是,是否有一个变量总是指向根目录(执行maven命令的根目录),而不管它来自反应堆中的哪个项目



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

我认为,没有这样的变量。只有一种解决办法,如的公认答案

是否存在始终指向根目录(执行maven命令的根目录)的变量


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

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

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


另请参见:

可以使用以下方法创建此属性:。 使用插件的
最高basedir
目标,您可以将根路径分配给指定的任何属性。

使用

与其他建议不同:

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

org.commonjava.maven.plugins
目录maven插件
0.1
目录
目录
初始化
myproject.basedir
com.my.domain
我的根神器

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

对于我来说,在变量插值过程中需要根目录,而不是插件部分-使用手工制作的JAR相对于根的本地目录。我知道这一点使用JAR创建本地目录是一种不好的做法,但这是项目的要求

我无法使用不同解决方案的原因:

  • ${session.executionRootDirectory}
    ${user.dir}
    与执行maven命令的目录绑定。我想引用独立于启动maven的目录的同一目录
  • ${project.basedir}
    如上所述,指向当前项目目录,因此子模块将在错误的位置搜索JAR
  • 我有大约100个项目,所以在我的例子中,定义相对路径或使用接受的问题答案是相当复杂的
  • 只能用于插件配置,不能用于变量插值
因此,在我的需求不好的情况下,我使用了环境变量,它引用项目根并在pom.xml中使用它。当其他解决方案不起作用时,将其作为最后手段使用。下面是我如何在我的情况下使用环境变量的示例:

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

本地马文回购
文件://${env.PROJECT_ROOT}/local repo

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

但无论如何,令人不安的是,如果我们创建了它,就会有这样的变量:(在Maven 3.6.3 I确定的情况下,如果插件目标配置在子模块pom.xml中,这将引用运行Maven的模块目录。如果在开发中从子模块目录运行,它将不会像人们希望的那样“向上引用”。但是,对于大多数目的来说,这已经足够了。如果.mvn目录(可能是空的)存在于多模块项目的根目录中,这将100%起作用(同样适用于3.6.3)