使用Maven从配置文件中默认系统属性

时间:2018-08-26 21:41:21

标签: java maven properties-file

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

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>

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

但是在我的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。但是,如果我从命令行指定它,那么它将在这里起作用,因为它适用于整个应用程序。

是否有一种好方法来读取属性并像在整个应用程序范围的命令行中一样应用它们?

谢谢!

1 个答案:

答案 0 :(得分: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>

然后,您可以将这些值用于休眠conf:

<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内,并最终创建更多配置文件,以便在构建相应的程序包时对其进行编辑。