Проблема с записью свойств пути к файлу в ant - PullRequest
3 голосов
/ 29 июля 2010

У меня проблема с записью свойства, которое содержит значение пути к каталогу в файле свойств.

Мой скрипт первоначально читает это конкретное свойство, назовите его «appserver.home», из файла props, используя <property file="source.props"/>. Я повторил входящее значение, и оно правильно читается как C: \\ somedir \\ jboss_4_2_3.

Далее моему сценарию необходимо передать это значение в другой файл свойств (используемый другим сценарием ant, хотя это не важно). Для создания этого другого файла я использую специальный шаблонный файл с заполнителями, окруженными $ .... $, чтобы вставить правильные значения в правильное место, используя следующее: -

 <copy file="template_file.props" tofile="target.props">
    <filterset begintoken="$" endtoken="$">
        <filter token="appServerDir" value="${appserver.home}"/>
        <filter token="dbusername" value="${database.name}"/>
        ....
    </filterset>
 </copy>                

Проблема в том, что значение в target.props теперь равно C: \ somedir \ jboss_4_2_3 , то есть оно потеряло escape-символы. Когда следующий скрипт ant использует этот файл, он интерпретирует значение свойства как C: somedirjboss_4_2_3 .

Итак, вопрос, как мне сказать муравью, что значение, которое я пишу, является путем к файлу? Обратите внимание, я попробовал следующее, что на самом деле работает: -

<propertyfile file="target.props">
    <entry key="appServerDir" value="${appserver.home}"/>
</propertyfile>

.. т.е. он выводит имя как c \: \\ somedir \\ jboss4_2_3 , но я бы предпочел не использовать эту технику, а использовать технику файла шаблона, поскольку она содержит некоторые свойства, которые всегда статичны, а также комментарии и т. д.

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 25 ноября 2010

Есть некоторые, возможно, запутанные различия между задачами в отношении обработки побегов, происходящих здесь.

Когда вы говорите, что appserver.home правильно отображает эхо, я полагаю, вы используете задачу 'echoproperties', которая показывает вам значение, сохраненное без интерполяции экранированных символов. И это показывает то же число выходов, что и в вашем файле 'source.props'.

Проблема в том, что, в общем случае, когда Ant интерполирует это значение в строку, он будет использовать экранированные символы, следовательно, они исчезают. Исключением из этого является задача 'propertyfile', где вы обычно хотите, чтобы экранированные символы сохранялись в выходном файле свойств - как вы заметили - для того, чтобы файл можно было правильно прочитать позже.

Итак, что делать?

Пожалуй, самое простое - убедиться, что свойства, считанные из 'source.props', сохраняют свои экранированные значения для использования в более поздних фильтрах. Поэтому вместо использования

<property file="source.props"/>

для загрузки используйте

<loadproperties srcfile="source.props">
    <filterchain>
        <replacestring from="\" to="\\" />
    </filterchain>
</loadproperties>

Это должно обеспечить распространение ваших escape-последовательностей.

1 голос
/ 30 ноября 2010

Я только что протестировал использование Apache Ant version 1.7.1 compiled on May 25 2010 на сервере Ubuntu 10.10 и использование Apache Ant версии 1.7.1, скомпилированного 27 июня 2008 года в Eclipse 3.6 для Windows XP. теперь результаты (у обоих одинаковые):

Переменная в source.props:
appserver.home=C\:\\somedir\\jboss_4_2_3

Эхо на консоли:
[echo] C:\somedir\jboss_4_2_3

Переменная в target.properties:
appserver.home=C:\somedir\jboss_4_2_3

РЕДАКТИРОВАТЬ - решение ниже; -D

По моему мнению, вы должны использовать файл propertyfile , если вы прочитали руководство по этой задаче, вы увидите, что он в состоянии манипулировать существующими файлами свойств. Этот работает для меня, и все комментарии и переменные из шаблона сохранены.

<copy file="template_file.props"  tofile="target.props" />
<propertyfile  file="target.props">
    <entry  key="appserver.home" value="${appserver.home}"/>
</propertyfile>
0 голосов
/ 29 июля 2010

В качестве обходного пути вы также можете написать исходное свойство, используя прямые косые черты, как C:/somedir/jboss_4_2_3, для которого не нужно вводить escape-символы.

0 голосов
/ 29 июля 2010

Я только что проверил следующее с помощью интегрированной поддержки муравьев Eclipse:

<copy file="test.props" tofile="target.props">
    <filterset begintoken="$" endtoken="$">
    <filter token="appServerDir" value="C\:\\somedir\\jboss_4_2_3"/>
    </filterset>
</copy> 

и генерирует следующий файл:

C\:\\\somedir\\\jboss_4_2_3

Какую версию муравья вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...