Ant: Могу ли я получить определенное свойство из XML-файла? - PullRequest
3 голосов
/ 09 мая 2011

Я использую ant для установки серверов для тестирования.В файле свойств у меня есть список параметров для базы данных.Проблема в том, что мне нужно изменить 5-6 параметров при изменении базы данных.Большинство из них зависят от имени базы данных.Поэтому я подумал, что создаю XML-файл со всеми различными базами данных, которые мы используем, и просто ввожу имя в файл свойств.Затем при запуске файла сборки он получает правильные свойства для используемой базы данных.Я создал xml-файл следующим образом:

<databases>
<database>
    <server>mssql_1</server>
    <port>1433</port>
    <sid_instance>foobar</sid_instance>
    <path></path>
    <hostuser>sa</hostuser>
    <hostpwd>password</hostpwd>
    </database>
<database>
    <server>oracle_1</server>
    <port>1521</port>
    <sid_instance>foobar</sid_instance>
    <path>C:\\oracle\\oradata\\foobar</path>
    <hostuser>system</hostuser>
    <hostpwd>password</hostpwd>
</database>
</databases>

Я вызываю файл в моем файле сборки с помощью:

<xmlproperty file="databases.xml"  />

Так что, когда мой файл свойств сообщает, что "mssql_1" должно бытьиспользуется, я хочу загрузить соответствующие свойства.

Но независимо от того, как я пытаюсь выбрать правильные данные, я получаю все порты, такие как: "1433, 1521", когда я пытаюсь с

<echo message="${databases.database.port}">

Я искал разные способы сделать это, но я не могу найти способ сделать это.Но похоже, что должно быть простым делом ...

1 Ответ

3 голосов
/ 09 мая 2011

Ваш файл свойств имеет две сущности с одинаковым значением. Задача <xmlproperty> считывает весь XML-файл, а затем использует сущности для задания имени свойства. Если у вас есть два объекта с одним и тем же свойством, значением этого конкретного свойства будут оба вместе.

Большинство людей имеют отдельный файл свойств для каждой базы данных, а затем используют задачу <property> с параметром file для чтения в этом конкретном файле свойств. Таким образом, у вас должно быть два файла свойств:

database.mssql.properties

server=mssql_1
port=1433
sid_instance=foobar
path=
hostuser=sa
hostpwd=password

database.oracle.properties

server=oracle_1
port=1521
sid_instance=foobar
path=C:/oracle/oradata/foobar
hostuser=ssytem
hostpwd=password

Затем в файле build.xml вы читаете один и только один файл свойств, основанный на базе данных:

<property name="database"  value="mssql"/>   <!-- Default database -->
<property name="database.file   value="database.${database}.properties"/>

<fail message="No such database file &quot;${database.file}&quot;">
    <condition>
        <not>
            <available file="${database.file} type="file"/>
        </not>
    </condition>
 </fail>

<property file="${database.file}"/>

Когда кто-то запускает Ant, он может использовать параметр -D для установки базы данных:

$ ant -Ddatabase=oracle

Это переопределит свойство database внутри файла build.xml и будет использовать базу данных Oracle. Если вы не укажете базу данных, она будет использовать базу данных по умолчанию (MS SQL).

И это также будет работать, если в другом файле свойств указано имя файла свойств:

<property file="build.properties"> <!-- Contains database name -->
<property name="database.file"   value="database.${database}.properties"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...