[英]Defaulting system properties from a config file using maven
我有一些從命令行指定的系統屬性,例如
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
。 但是,如果我從命令行指定它,那么它將在這里起作用,因為它適用於整個應用程序。
有沒有什么好方法可以讀取屬性並像在整個應用程序范圍的命令行中一樣應用它們?
謝謝!
您正在混淆事物; 您要引用的properties-maven-plugin
位於properties-maven-plugin
,並且您正在對其進行配置,以便它可以讀取文件的屬性。
但這不是在Maven中使用“共享”屬性的方法,而只是從文件中讀取某些值的一種方法。
為了在pom之外可見,您必須將一個屬性指定為“ global”,例如:
<?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中,並最終創建更多配置文件,以便在構建相應的程序包時可以對其進行編輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.