如何从java代码中获取Maven project BaseDir()

如何从java代码中获取Maven project BaseDir(),java,maven-2,Java,Maven 2,如何从我的Java代码中获取Maven project basedir()?您不能,因为Maven用于构建,并且在构建之后不“存在” 如果您在构建过程中需要它(例如通过exec插件),那么它可以作为系统属性访问,也可以作为参数传递给执行的程序。根据,有一个maven属性${project.basedir} 如果您在资源中包含一个属性文件,其中包含${project.basedir}占位符,并且,您将发现在构建时将basedir替换为属性文件。然后,您可以使用代码中的Properties实例加载它

如何从我的Java代码中获取Maven project basedir()?

您不能,因为Maven用于构建,并且在构建之后不“存在”

如果您在构建过程中需要它(例如通过exec插件),那么它可以作为系统属性访问,也可以作为参数传递给执行的程序。

根据,有一个maven属性
${project.basedir}

如果您在资源中包含一个属性文件,其中包含
${project.basedir}
占位符,并且,您将发现在构建时将basedir替换为属性文件。然后,您可以使用代码中的
Properties
实例加载它

在/src/main/resources中,创建一个名为project.properties的文件,其中包含

my.basedir=${project.basedir}
然后,在POM中,启用对/src/main/resources的过滤,如上面链接的maven资源过滤文档中所述

然后,在代码中,在运行时,将属性文件加载到
properties
实例中

Properties props = new Properties();
props.load(this.getClass().getResourceAsStream("project.properties"));
String myBasedir = props.get("my.basedir");

另一种方法是处理一些源文件,并通过挂接到
处理源文件
阶段在其中进行替换,但这不太容易解释。

我假设您在从“exec:exec”或“test”运行时希望这样做。如果是这样的话,你可以通过

System.getProperties().get("basedir")

我在Maven site file=new文件(project.getBasedir(),file)中找到了这段代码;但是我不知道如何获得这个项目对象@FerasOdeh:你在开发插件吗?如果不是的话,那个网站也帮不了你。你是说写一个maven插件?如果这是真的,那么您将可以通过maven插件API访问
项目
。@Feras Odeh-您的用例是什么-为什么需要它?@FerasOdeh,请参见此处以访问项目信息,我们必须添加一个MavenProject作为参数:
@parameter(defaultValue=“${project}”,required=true,readonly=true)马文尼项目您可能应该备份一个步骤,并解释您正在尝试执行的操作。这个问题非常模糊,听起来像是你试图用错误的方式做某事。在java 8中,你可以使用以下代码:
path.get(“”.toFile().getAbsolutePath()
FileSystems.getDefault()
我想从单元测试中的java代码(src/test/java)中获取basedir来解析我的配置(src/main/resources/config/*.xml). 它很容易使用。path.get(“”.toFile().getAbsolutePath()@XBMONI在我的pom中使用了${basedir}属性,它工作得很好,但是如何在Java代码中获得它呢?请按照上面的说明进行操作。我会尽量让这条路走一点clearer@ptomli当我将${project.version}写入pom文件时,我可以检索它的值,但是当我将它写入属性文件时,我无法检索它的值。我正在开发一个定制的maven插件,我该怎么做?@kamaci这将取决于很多事情,但我首先要检查的是资源插件是否正在过滤属性文件。另外,不要在评论中提问,创建一个新的问题,你会得到更好的回答。@kamaci根据:“
defaultValue
…可以包含引用项目的表达式”你可以使用
@参数(defaultValue=“${[project.]basedir}”)私有字符串basedir。应该也行,这不行。它的工作原理是告诉maven exec插件使用maven的${project.basedir}传递一个系统属性(根据需要命名)。类似这样的东西:basedir${project.basedir}这个解决方案对我来说在maven 3.0.3上很有效,但显然从maven和在IDE中工作需要更多的时间。不幸的是,maven不推荐这种方法,因为可以在这里看到:@DTK这是一个10年前的答案。。。很多事情都改变了。