Применяет ли ANT префиксные значения, если нет свойства нужного имени? Или это ошибка? (Sscce обеспечил)
У меня такое странное поведение с ant
и свойствами, и я хотел бы знать, что вы думаете. Я не понимаю логики.
Это поведение может быть полезным, но я хотел бы знать, могу ли я положиться на него или это ошибка.
Похоже, что ant применяет префикс при расширении правой части свойств, если нет свойства нужного имени. Вот SSCCE:
Построить.свойства:
a=A
formula=${a}
Построить.xml:
<project default="test">
<target name="test">
<property name="test.a" value="[test.a has been used instead of a, why? prefixValues is false]" />
<property file="build.properties" prefix="test" prefixValues="false" />
<echo>${test.formula}</echo>
</target>
</project>
Вывод:
test:
[echo] [test.a has been used instead of a, why? prefixValues is false]
BUILD SUCCESSFUL
Total time: 364 milliseconds
Как вы можно посмотреть, проверить.формула должна использовать "а", а не "тест".но "а"никогда не определяется. В этом ли причина?
4 ответа:
Действительно, это кажется странным. На мой взгляд, выход должен быть
${a}
Я сделал несколько тестов, и я замечаю, что:
Если вы определяете
a
вbuild.xml
вместоbuild.properties
: это работает как ожидалось. то есть со следующимbuild.xml
:<project default="test"> <target name="test"> <property name="a" value="A" /> <property file="build.properties" prefix="test" prefixValues="false" /> <echo>${test.formula}</echo> </target> </project>
И построение.свойства
formula=${a}
Выход -
A
Но , Если вы измените на
prefixValues="true"
, то результат будет:${a}
Пока я ждал :
${test.a}
Наконец, если вы определяете
<property name="test.a" value="some value" />
в строить.xml (всегда сprefixValues="true"
): Вывод Теперь (как и ожидалось)some value
Итак, мой вывод:
PrefixValues работает нормально, как только свойство, используемое на правой стороне , не определено в том же файле свойств.
Префиксные значения игнорируются для свойств, используемых в правой части и определенных в том же файле свойств.
Взглянув в муравьином коде, в свойствах связанных классов, на
org.apache.tools.ant.property.ResolvePropertyMap
класс:public void resolveAllProperties(Map<String, Object> map, String prefix, boolean prefixValues) { // The map, prefix and prefixValues flag get used in the // getProperty callback this.map = map; this.prefix = prefix; this.prefixValues = prefixValues; for (String key : map.keySet()) { expandingLHS = true; Object result = getProperty(key); String value = result == null ? "" : result.toString(); map.put(key, value); }
Затем в
getProperty(String)
методе (фрагмент):Таким образом, как вы можете видеть, если свойство присутствует в файле свойств, оно получит префикс, даже если// If the property we are looking up is a key in the map // (first call into this method from resolveAllProperties) // or we've been asked to prefix the value side (later // recursive calls via the GetProperty interface) the // prefix must be prepended when looking up the property // outside of the map. String fullKey = name; if (prefix != null && (expandingLHS || prefixValues)) { fullKey = prefix + name; }
prefixValues
ложно.
Я провел еще несколько тестов и смог получить много разных результатов.
После проверки источников, я думаю, что есть ошибка при поиске свойств при добавлении их через файл. Изменив исходный код ant, я мог заставить его работать.
В конце концов, я решил заполнить отчет об ошибке (https://issues.apache.org/bugzilla/show_bug.cgi?id=54769 ) с предложенным патчем.
Спасибо вам всем.
Это потому, что свойства неизменны. Как только они установлены, они застряли таким образом для остальной части сборки. проверьте документы для "свойства" в руководстве Ant. На самом деле это своего рода проблема для некоторых людей, поэтому ребята из ant-contrib включили новую задачу для имитации переменной.
Если вы измените свою сборку примерно так:
<project default="test"> <target name="test"> <property file="build.properties" prefix="test" prefixValues="false" /> <property name="test.a" value="[test.a has been used instead of a, why? prefixValues is false]" /> <echo>${test.formula}</echo> </target> </project>
Вы получаете " а " на консоли. Это потому что тест.а и тест.формула была определена в первом вызове до вашего нового (игнорируется) задание на ' тест.a '