【问题标题】:Defaulting system properties from a config file using maven使用 maven 从配置文件中默认系统属性
【发布时间】:2019-02-01 11:15:33
【问题描述】:

我有一些从命令行指定的系统属性 例如

mvn -Djdbc.url=... -Djdbc.user=... -Djdbc.password=... clean install

我不想从命令行显式指定每个值,而是希望有一个硬编码的 .properties 文件默认这些值,但我仍然可以根据需要使用命令行覆盖它们。

我知道properties-maven-plugin 是从文件中读取属性的几种方法之一,但是如何读取属性并将它们应用到系统范围内呢?这些属性似乎只在我的pom.xml 中使用时才有效。如果我有其他一些配置文件(例如 Hibernate 配置文件),它似乎不起作用。

例子:

在我的pom.xml 我有

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0.0</version>
        <executions>
            <execution>
                <goals>
                    <goal>set-system-properties</goal>
                </goals>
                <configuration>
                    <properties>
                        <!-- 
                            Alternatively this can read properties from a config file too 
                            Hardcoded inline here for example purposes
                        -->
                        <property>
                            <jdbc.url>...</jdbc.url>
                            <jdbc.user>...</jdbc.user>
                            <jdbc.property>...</jdbc.property>
                        </property>
                    </properties>
                </configuration>
            </execution>
        </executions>
    </plugin>

现在我可以在pom.xml 的任何地方使用jdbc.* 属性,甚至可以根据需要从命令行覆盖它们。

但是在我的 Hibernate 配置文件中我有

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="dialect">org.hibernate.dialect.PostgreSQL95Dialect</property>

        <property name="connection.url">${jdbc.url}</property>
        ...
        ...
    </session-factory>
</hibernate-configuration>

jdbc.url 和其他属性在此处显示为空白/空字符串,因为我从文件中读取的属性仅适用于我的pom.xml。但是,如果我从命令行指定它,它可以在这里工作,因为它适用于整个应用程序。

有没有一种很好的方法来读取属性并像从命令行一样在应用程序范围内应用它们?

谢谢!

【问题讨论】:

  • 你在用springboot吗?
  • @tryingToLearn - 我不是,我正在使用 spark-java。应该在问题中提到。

标签: java maven properties-file


【解决方案1】:

你把事情搞混了; 您所指的属性位于properties-maven-plugin 内,并且您正在对其进行配置,以便它可以读取文件的属性。

但这不是在 maven 中使用“共享”属性的方法,它只是从文件中读取某些值的一种方法。

为了在 pom 之外可见,您必须将属性指定为“全局”,例如:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

<groupId>*********</groupId>
<artifactId>******</artifactId>
<packaging>war</packaging>
<version>*****</version>
<name>****</name>

<properties>
    <!-- Hibernate Configuration-->
    <jdbc.url>...</jdbc.url>
    <jdbc.user>...</jdbc.user>
    <jdbc.property>...</jdbc.property>
</properties>

然后,您可以在您的休眠配置中使用这些值:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="dialect">org.hibernate.dialect.PostgreSQL95Dialect</property>

        <property name="connection.url">${jdbc.url}</property>
        ...
        ...
    </session-factory>
</hibernate-configuration>

将全局属性设置到 pom 中的唯一方法是让它们在 pom 之外可见。

我建议你将你的休眠连接信息移动到你的 pom 中,并最终创建更多的配置文件,这样你就可以在构建相应的包时对其进行编辑。

【讨论】:

  • 感谢@Leviland!该解决方案效果很好,尽管我在两个痛点上苦苦挣扎。首先,随着属性列表的增长,该部分变得杂乱无章。这当然是一个外观问题,但将它们放在一个文件中会很方便。其次,为不同的层(本地、开发、生产等)拥有不同的属性文件会更有条理。我知道你提到了 maven 配置文件,但我觉得他们只走了这么远,仍然让你的 pom 杂乱无章。感谢答案,只是想知道是否有任何其他方式可以使道具可以是全局的但保留在文件中
  • 据我所知,没有办法做你想做的事。顺便说一句,个人资料仍然是一个很好的解决方案,恕我直言,它们足以保持事物的组织性和可读性!很高兴有帮助:)
猜你喜欢
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2013-07-18
  • 2019-01-25
相关资源
最近更新 更多