如何在maven构建时注入一个属性,该属性稍后在java项目的运行时可以访问?

如何在maven构建时注入一个属性,该属性稍后在java项目的运行时可以访问?,java,maven,system-properties,Java,Maven,System Properties,当java项目由maven构建时,我试图通过命令行注入属性,如 mvn clean install -DMYPROP=myProperty 我认为这足以让maven将其转换为一个系统属性,然后可以通过System.getProperty(“MYPROP”)在java中访问该属性。但这并不奏效 所以我做了更多的研究,这里的一篇帖子指向Maven属性,所以我在pom.xml中尝试了以下内容: <properties> <MY.VARIABLE>${MYPROP}

当java项目由maven构建时,我试图通过命令行注入属性,如

mvn clean install -DMYPROP=myProperty  
我认为这足以让maven将其转换为一个系统属性,然后可以通过
System.getProperty(“MYPROP”)
在java中访问该属性。但这并不奏效

所以我做了更多的研究,这里的一篇帖子指向Maven属性,所以我在pom.xml中尝试了以下内容:

<properties>
    <MY.VARIABLE>${MYPROP}</MY.VARIABLE>
    <MY.ENV.VARIABLE>${env.MYPROP}</MY.ENV.VARIABLE>
</properties>
我还尝试了使用基于的properties maven插件。该属性也是空的


有什么建议吗?

据我所知,无法为您构建的Java应用程序设置系统属性


如果要保存信息以供以后在Java应用程序中使用,可以将属性文件用作打包到jar中的资源。

据我所知,无法为您构建的Java应用程序设置系统属性

如果要保存信息以供以后在Java应用程序中使用,可以将属性文件用作打包到jar中的资源。

我用于将Maven属性写入.properties文件

在POM中,指定包含属性文件的目录并启用筛选:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

src/main/resources
符合事实的
然后在属性文件(如:src/main/resources/application.properties)中,引用一个属性:

my.property=${my.maven.property}

然后,在构建项目时,您的属性将写入target/dir中的属性文件。然后在应用程序中,在运行时加载属性文件并访问该值。

我用于将Maven属性写入.properties文件

在POM中,指定包含属性文件的目录并启用筛选:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

src/main/resources
符合事实的
然后在属性文件(如:src/main/resources/application.properties)中,引用一个属性:

my.property=${my.maven.property}


然后,在构建项目时,您的属性将写入target/dir中的属性文件。然后在应用程序中,在运行时加载属性文件并访问该值。

您可以将属性保存到构建工件内的文件中

例如,文件
src/main/resources/myProperties.properties

mavenProperty=${MYPROP}
您需要在
pom.xml
中调整过滤:


...
src/main/resources
符合事实的

然后,当您使用
-DMYPROP=some值运行maven时,
myProperties.properties将包含:

mavenProperty=some-value
因此,通过加载属性资源(而不是使用
System.getProperty(..)
),您将能够在运行时获得
一些值:

公共类应用程序{
公共静态void main(字符串[]args)引发IOException{
属性=新属性();
load(App.class.getResourceAsStream(“/myProperties.properties”);
获取(“mavenProperty”);
}                                                                            
}                                                                                                                          

您可以将属性保存到构建工件内的文件中

例如,文件
src/main/resources/myProperties.properties

mavenProperty=${MYPROP}
您需要在
pom.xml
中调整过滤:


...
src/main/resources
符合事实的

然后,当您使用
-DMYPROP=some值运行maven时,
myProperties.properties将包含:

mavenProperty=some-value
因此,通过加载属性资源(而不是使用
System.getProperty(..)
),您将能够在运行时获得
一些值:

公共类应用程序{
公共静态void main(字符串[]args)引发IOException{
属性=新属性();
load(App.class.getResourceAsStream(“/myProperties.properties”);
获取(“mavenProperty”);
}                                                                            
}                                                                                                                          

实现目标有几种方法。下面是其中之一

无论您决定做什么,使用
properties
文件存储您的属性都是一个很好的做法

使用
maven
可以使用配置文件并为不同的配置文件创建不同的
属性
文件。要使maven将属性值传递给属性文件,请使用资源筛选。示例如下:

<project ... >
    .
    .
    .
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <my.prop>dev_value</my.prop>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <my.prop>prod_value</my.prop>
            </properties>
        </profile>
    </profiles>
    .
    .
    .
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
这将最终替换
my.prop
的值,如果没有找到,将使用默认值
default\u值


希望这对你有所帮助。

有几种方法可以实现你的目标。下面是其中之一

无论您决定做什么,使用
properties
文件存储您的属性都是一个很好的做法

使用
maven
可以使用配置文件并为不同的配置文件创建不同的
属性
文件。要使maven将属性值传递给属性文件,请使用资源筛选。示例如下:

<project ... >
    .
    .
    .
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <my.prop>dev_value</my.prop>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <my.prop>prod_value</my.prop>
            </properties>
        </profile>
    </profiles>
    .
    .
    .
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
这将最终替换my.prop的值,如果没有找到,则d