Статьи

Муравьиные нюансы

Время от времени мне напоминают о некоторых тонких нюансах свойств Ant, которые, если их забыть, могут привести к путанице при работе с Ant . В частности, тот факт, что свойства Ant, как правило, являются неизменяемыми (не считая локальных свойств, как в Ant 1.8 ) и устанавливаются «постоянно» при первой настройке, может привести к несколько неожиданным результатам.

В разделе свойств Ant Manual указано: «Обычно значения свойств не могут быть изменены, после того как свойство установлено, большинство задач не позволяют изменять его значение». В разделе этого руководства по задаче «Свойство» добавлено: «Свойства являются неизменяемыми: кто бы ни устанавливал свойство, он сначала замораживает его до конца сборки; они определенно не переменные ».

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

Хотя определение свойств в файле сборки Ant не может переопределять значения встроенных свойств Ant по умолчанию или системных свойств Java, эти значения для имен этих свойств обычно можно задать с помощью параметра -D на панели запуска Ant. Однако небольшое их количество не может быть сброшено даже с опцией -D . Например, ant.file нельзя изменить из пути и имени файла сборки Ant, даже если он передан в качестве параметра через параметр -D . Конечно, это, вероятно, так же хорошо, потому что, кажется, нет веских причин притворяться, что файл сборки Ant — это что-то иное, чем он есть на самом деле.

Чтобы продемонстрировать приведенные выше «правила» разрешения свойств Ant, можно использовать следующий простой файл сборки Ant.

build.xml Отображение свойств в Ant

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<project name="Project" default="showProperties" basedir=".">
 
   <property environment="env"/>
 
   <target name="showProperties">
      <!-- Java System Properties -->
      <echo message="java.home: ${java.home}" />
      <echo message="user.home: ${user.home}" />
      <!-- Custom Properties -->
      <echo message="name.last: ${name.last}" />
      <echo message="name.first: ${name.first}" />
      <!-- Ant Built-in Properties -->
      <echo message="ant.file: ${ant.file}" />
      <echo message="ant.version: ${ant.version}" />
      <echo message="ant.java.version: ${ant.java.version}" />
   </target>
 
</project>

В этом примере есть несколько системных свойств Java, несколько пользовательских свойств и несколько встроенных свойств Ant. Это позволяет мне легко продемонстрировать, как свойства могут быть переопределены или не переопределены. На следующем снимке экрана показаны настройки свойств по умолчанию без переопределения. Два пользовательских не определены вообще, но другие (встроенные свойства системы Java и Ant) имеют значения, автоматически устанавливаемые для сборки Ant.

runningAntShowPropertiesTargetNoOverridden

На следующем снимке экрана показана попытка предоставить значения свойств, используемых в сборке, путем передачи их через параметры -D . Как показано в примере, даже системные свойства и встроенные свойства Ant могут быть переопределены с помощью параметра -D , но свойство ant.file не переопределяется.

runningAntShowPropertiesDArgOverride

Обычный способ указать свойства, используемые в файле Ant, — указать их в файле сборки Ant с помощью задачи «Свойство» . Следующий листинг кода добавляет внутренние свойства к файлу, показанному выше.

build.xml Определение свойств внутри

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<project name="Project" default="showProperties" basedir=".">
 
   <property environment="env"/>
   <property name="user.home" value="/bin" />
   <property name="java.home" value="java" />
   <property name="name.last" value="Flintstone" />
   <property name="name.first" value="Fred" />
   <property name="ant.file" value="text.txt" />
   <property name="ant.version" value="1.8." />
   <property name="ant.java.version" value="6" />
 
   <target name="showProperties">
      <!-- Java System Properties -->
      <echo message="java.home: ${java.home}" />
      <echo message="user.home: ${user.home}" />
      <!-- Custom Properties -->
      <echo message="name.last: ${name.last}" />
      <echo message="name.first: ${name.first}" />
      <!-- Ant Built-in Properties -->
      <echo message="ant.file: ${ant.file}" />
      <echo message="ant.version: ${ant.version}" />
      <echo message="ant.java.version: ${ant.java.version}" />
   </target>
 
</project>

На следующем снимке экрана показан запуск этого файла Ant без каких-либо свойств, предоставленных аргументами -D . Обратите внимание, что единственными свойствами, которые были успешно установлены внутренней спецификацией, являются пользовательские свойства. Системные свойства Java и встроенные свойства Ant не зависят от попыток внутренней установки свойств.

runningAntShowPropertiesInternallyAttemptedOverride

Существуют преимущества того, что свойства Ant обычно неизменны. Тем не менее, следует быть осторожным, если предположить только то, что свойство объявлено в конкретном файле сборки Ant (или в файле свойств, на который ссылается этот файл сборки), что это фактически значение, для которого установлено это свойство для сборки. Если свойство уже было задано в другом месте, локальная попытка переопределения свойства не имеет никакого эффекта, кроме ложного объявления значения для этого свойства, которое фактически не применяется.

Ссылка: Ant Properties Нюансы от нашего партнера JCG Дастина Маркса в блоге Inspired by Actual Events .