По умолчанию системные свойства из конфигурационного файла, используя Maven - PullRequest
0 голосов
/ 27 августа 2018

У меня есть некоторые системные свойства, которые я указываю из командной строки, например

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 голосов
/ 27 августа 2018

Вы путаете вещи;свойство, на которое вы ссылаетесь, находится внутри 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 - единственный способ сделать их видимыми вне его.

Я предлагаю вам переместить вашhibernate информация о подключении внутри вашего pom, и в конечном итоге создать больше профилей, так что вы можете редактировать их при создании соответствующего пакета.

...