Применяет ли 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 4

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 '