ANT: задача loadresource вызывается дважды - PullRequest
1 голос
/ 02 сентября 2011

У меня есть очень простая муравейная задача, которая ведет себя странно.

Это не больше, чем этот build.xml без каких-либо зависимостей:

<project name="Test" default="recreate-via-http" >

    <target name="recreate-via-http">
        <loadresource property="result" >
            <url url="http://someserver/somecall.php"  />           
        </loadresource>  
        <echo>${result}</echo>
    </target>

</project>

Странно то, что это выполняется дважды, тогда как все остальное в скрипте ant запускается только один раз.

Это означает, что http-вызов поступает на сервер дважды. я даже перехватил http-трафик с помощью wireshark, и он подтверждает, что http-вызов выполняется дважды.

Кажется, они даже вызываются точно в одно и то же время вплоть до миллисекунды.

Эхо отображается только один раз на выходе консоли.

Сценарий ant запускается с помощью встроенного в eclipse ant, хотя проблема также сохраняется при вызове из командной строки Windows с помощью автономного ant. Поэтому я не думаю, что это проблема IDE или цепочки целей.

Спасибо за любую помощь в этом!

РЕДАКТИРОВАТЬ: для чего это стоит, вот ссылка на задачу муравья, о которой я сообщил. https://issues.apache.org/bugzilla/show_bug.cgi?id=51762

Ответы [ 3 ]

1 голос
/ 02 сентября 2011

То, что вы видите, является недокументированным и возможно ошибочным поведением Ant. Я не смотрел в базе данных ошибок, но вот ссылка, если вы заинтересованы: http://ant.apache.org/bugs.html

То, что происходит, - это задача LoadResource , сначала проверяющая размер ресурса, а затем считывающая поток в буфер (ищите метод execute в строке 126). Класс URLResource открывает соединение для чтения заголовка Content-Length, , но затем закрывает соединение . Это означает, что необходимо заново открыть соединение, чтобы получить поток от него.

Я считаю, что вызов close() в строке 282 можно и нужно удалить. Однако может быть причина, по которой разработчики Ant разместили это там. Я оставлю это на ваше усмотрение, чтобы сообщить / проголосовать за такое поведение.

0 голосов
/ 21 декабря 2012

Мой обходной путь должен был использовать:

<get src="http://yourURL" dest="/dev/null" />

или в Windows: (протестировано в Windows 7)

<get src="http://yourURL" dest="NUL" />

Требуется атрибут dest. На самом деле я не хотел ничего скачивать, поэтому я отказываюсь от этого.

Я не знаю, требует ли это каких-либо зависимостей или нет, я уже установил все зависимости ant, прежде чем понял это.

0 голосов
/ 02 сентября 2011

---- Отредактировано для выравнивания с полным списком файлов муравьев, теперь доступно ----

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

<target name="recreate-via-http" unless="recreate-via-http.done">
  <property name="recreate-via-http.done" value="true"/>
  <loadresource property="result" >
    <url url="http://someserver/somecall.php"  />           
  </loadresource> 
  <echo>${result}</echo>
</target>

Если он вызывается дважды после установки такой защиты, то это код в реализации loadresource задачи ant, или ant вызывается дважды каким-либо внешним элементом (например, IDE). В любом случае это не ошибка в цепочке зависимостей.

Единственный способ исправить это - получить доступ к URL-адресу и проверить, нужно ли загружать файл; затем, если это нужно загрузить, загрузите его.

<target name="recreate-via-http">
   <antcall="check.recreate-via-http"/>
   <antcall="execute.recreate-via-http"/>
</target>

<target name="check.recreate-via-http">
   ... access the remote URL, and
       get it's last modified time
   ... access the local file copy, and
       get it's last modified time
   ... call an ant condition to determine
       if the two times are the same, setting
       a property 'execute.recreate-via-http.notNeeded'
       if they are identical.
</target>

<target name="execute.recreate-via-http" unless="execute.recreate-via-http.notNeeded">
   <loadresource property="result" >
     <url url="http://someserver/somecall.php"  />           
   </loadresource> 
   <echo>${result}</echo>
</target>

При такой структуре проверка будет выполняться каждый раз, но файл будет обновляться только в том случае, если измененное время отличается. Если файл не обновляется каждый раз, другие задачи, скорее всего, не будут обнаруживать его как новый и выполнять меньше работы (при условии, что он был написан для пропуска уже выполненной работы, например, javac, copy, mkdir и т. Д.).

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