<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>софт, хард &#38; интERнет &#187; Инструменты</title>
	<atom:link href="http://www.all-x.net/category/devel/tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.all-x.net</link>
	<description>Личный опыт укрощения компьютеров</description>
	<lastBuildDate>Mon, 30 Aug 2010 16:43:37 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>XUL Gear стал расширением Firefox</title>
		<link>http://www.all-x.net/2010/05/31/xulgear/</link>
		<comments>http://www.all-x.net/2010/05/31/xulgear/#comments</comments>
		<pubDate>Mon, 31 May 2010 08:11:39 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[XUL]]></category>
		<category><![CDATA[xulgear]]></category>
		<category><![CDATA[XULPIX]]></category>
		<category><![CDATA[ХабраХабр.]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=725</guid>
		<description><![CDATA[<p>Визуальный редактор XUL Gear, за которым <a href="http://www.all-x.net/2009/06/19/xulpix/">я слежу</a> ещё с тех пор, когда он назывался XULPIX, <a href="https://addons.mozilla.org/en-US/firefox/addon/162046/">выпущен в виде расширения к Firefox</a>. Об этом мне <a href="http://www.all-x.net/2009/06/19/xulpix/comment-page-1/#comment-29466">сообщил Илья Харламов</a>, который в настоящее время поддерживает этот проект. А я решил, что пора  <a href="http://habrahabr.ru/blogs/firefox/94988/">ознакомить с XUL Gear широкую хабраобщественность</a>.</p>
]]></description>
			<content:encoded><![CDATA[<p>Визуальный редактор XUL Gear, за которым <a href="http://www.all-x.net/2009/06/19/xulpix/">я слежу</a> ещё с тех пор, когда он назывался XULPIX, <a href="https://addons.mozilla.org/en-US/firefox/addon/162046/">выпущен в виде расширения к Firefox</a>. Об этом мне <a href="http://www.all-x.net/2009/06/19/xulpix/comment-page-1/#comment-29466">сообщил Илья Харламов</a>, который в настоящее время поддерживает этот проект. А я решил, что пора  <a href="http://habrahabr.ru/blogs/firefox/94988/">ознакомить с XUL Gear широкую хабраобщественность</a>.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=725&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/05/31/xulgear/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Если не запускается Eclipse</title>
		<link>http://www.all-x.net/2009/12/17/eclipse-maxpermsize/</link>
		<comments>http://www.all-x.net/2009/12/17/eclipse-maxpermsize/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 19:52:15 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=478</guid>
		<description><![CDATA[<p>Пару месяцев назад разбирался, почему у коллеги Eclipse отказывается стартовать, выдавая вот такое окошко:<br />
<a href="http://www.all-x.net/wp-content/uploads/2009/12/eclipse-maxpermsize.gif"><img src="http://www.all-x.net/wp-content/uploads/2009/12/eclipse-maxpermsize-300x157.gif" alt="eclipse-maxpermsize" title="eclipse-maxpermsize" width="300" height="157" class="alignright size-medium wp-image-479" /></a><br />
Решение нашел и благополучно забыл. А сегодня эта напасть добралась и до моего ноутбука. Еле вспомнил решение: надо в файле <code>eclipse.ini</code> уменьшить значение параметра <code>--launcher.XXMaxPermSize</code>, экспериментально подобрать максимум, при котором Eclipse стартует. Смешно, в свое время боролись с другой ошибкой&#160;&#8212; во время работы Eclipse жаловалась, что PermGen space не хватает (точный текст уже не помню). А лечилось это <em>увеличением</em> значения того же параметра. Много хорошо&#160;&#8212; тоже плохо...</p>
]]></description>
			<content:encoded><![CDATA[<p>Пару месяцев назад разбирался, почему у коллеги Eclipse отказывается стартовать, выдавая вот такое окошко:<br />
<a href="http://www.all-x.net/wp-content/uploads/2009/12/eclipse-maxpermsize.gif"><img src="http://www.all-x.net/wp-content/uploads/2009/12/eclipse-maxpermsize-300x157.gif" alt="eclipse-maxpermsize" title="eclipse-maxpermsize" width="300" height="157" class="alignright size-medium wp-image-479" /></a><br />
Решение нашел и благополучно забыл. А сегодня эта напасть добралась и до моего ноутбука. Еле вспомнил решение: надо в файле <code>eclipse.ini</code> уменьшить значение параметра <code>--launcher.XXMaxPermSize</code>, экспериментально подобрать максимум, при котором Eclipse стартует. Смешно, в свое время боролись с другой ошибкой&nbsp;&mdash; во время работы Eclipse жаловалась, что PermGen space не хватает (точный текст уже не помню). А лечилось это <em>увеличением</em> значения того же параметра. Много хорошо&nbsp;&mdash; тоже плохо...</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=478&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2009/12/17/eclipse-maxpermsize/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XUL Gear (ex. XULPIX): визуальный редактор для XUL</title>
		<link>http://www.all-x.net/2009/06/19/xulpix/</link>
		<comments>http://www.all-x.net/2009/06/19/xulpix/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 12:34:52 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[XUL]]></category>
		<category><![CDATA[xulgear]]></category>
		<category><![CDATA[XULPIX]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=378</guid>
		<description><![CDATA[<p>Очень я не люблю заниматься разработкой графических интерфейсов (GUI)&#160;&#8212; дело муторное, трудоемкое, результаты часто не заметны. Но иногда приходится. Платформа Mozilla, где для декларативного определения пользовательского интерфейса используется язык <a href="https://developer.mozilla.org/en/XUL/">XUL</a>, основанный на XML, а для определения поведения&#160;&#8212; JavaScript, почти примирила меня с этим занятием. Для полного счастья требовалось найти визуальный редактор, который позволяет обойтись без написания XUL кода вручную и сразу же показывает результат. И тут есть две новости, как всегда&#160;&#8212; одна хорошая, и одна плохая, но не очень. Хорошая новость в том, что такой редактор нашелся&#160;&#8212; это <a href="http://code.google.com/p/xulgear/">XUL Gear</a>. Плохая&#160;&#8212; автор Kenchabi его не поддерживает, не очень&#160;&#8212; потому что первоначальная версия редактора была переименована из XULPIX в XUL Gear и выложена под открытой лицензией на Google Code.</p>
<p>За управление проектом, судя по всему, взялся Илья Харламов, но пока никакой активности не видно&#160;&#8212; на Google Code лежат только сами исходники, без готовой сборки и даже без скриптов для сборки. Так что есть две возможности&#160;&#8212; либо <a href="http://kenchabi.blogspot.com/">скачивать XULPIX с блога первоначального разработчика</a> и пользоваться как есть, благо практически все работает, либо тормошить Илью Харламова, чтобы он привел проект в порядок или, хотя бы, принял в проект разработчика, готового что-то делать.</p>
<p>Сам редактор описывать не буду, лучше один раз увидеть, на YouTube лежит пара роликов:</p>
<p></p>
<p></p>
]]></description>
			<content:encoded><![CDATA[<p>Очень я не люблю заниматься разработкой графических интерфейсов (GUI)&nbsp;&mdash; дело муторное, трудоемкое, результаты часто не заметны. Но иногда приходится. Платформа Mozilla, где для декларативного определения пользовательского интерфейса используется язык <a href="https://developer.mozilla.org/en/XUL/">XUL</a>, основанный на XML, а для определения поведения&nbsp;&mdash; JavaScript, почти примирила меня с этим занятием. Для полного счастья требовалось найти визуальный редактор, который позволяет обойтись без написания XUL кода вручную и сразу же показывает результат. И тут есть две новости, как всегда&nbsp;&mdash; одна хорошая, и одна плохая, но не очень. Хорошая новость в том, что такой редактор нашелся&nbsp;&mdash; это <a href="http://code.google.com/p/xulgear/">XUL Gear</a>. Плохая&nbsp;&mdash; автор Kenchabi его не поддерживает, не очень&nbsp;&mdash; потому что первоначальная версия редактора была переименована из XULPIX в XUL Gear и выложена под открытой лицензией на Google Code.</p>
<p>За управление проектом, судя по всему, взялся Илья Харламов, но пока никакой активности не видно&nbsp;&mdash; на Google Code лежат только сами исходники, без готовой сборки и даже без скриптов для сборки. Так что есть две возможности&nbsp;&mdash; либо <a href="http://kenchabi.blogspot.com/">скачивать XULPIX с блога первоначального разработчика</a> и пользоваться как есть, благо практически все работает, либо тормошить Илью Харламова, чтобы он привел проект в порядок или, хотя бы, принял в проект разработчика, готового что-то делать.</p>
<p>Сам редактор описывать не буду, лучше один раз увидеть, на YouTube лежит пара роликов:</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/A-ImAogC0ug&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ja&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/A-ImAogC0ug&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ja&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/s8mGvCb1uLU&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ja&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/s8mGvCb1uLU&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ja&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=378&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2009/06/19/xulpix/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>blink и underline в XUL</title>
		<link>http://www.all-x.net/2009/06/17/blink-and-underline-in-xul/</link>
		<comments>http://www.all-x.net/2009/06/17/blink-and-underline-in-xul/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 08:11:51 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[XUL]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=359</guid>
		<description><![CDATA[<p>Понадобилось в XUL сделать мигающим текст метки. Попробовал <code>text-decoration:blink</code>&#160;&#8212; не работает. Погуглил&#160;&#8212; чудеса, оказывается, текст мигает только если он внутри тега <code>label</code>, а не в атрибуте <code>value</code>. Самое смешное, что подчеркивается он строго в обратной ситуации, то есть сделать одновременно мигающий и подчеркнутый текст, похоже, невозможно <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Firefox покажет результат здесь:</p>
<p>Если вы видите этот текст, попробуйте прочитать этот пост <a href="http://www.all-x.net/2009/06/17/blink-and-underline-in-xul/">здесь</a>. Если не помогло, значит ваш браузер не поддерживает фреймы.</p>
<p><a href='http://www.all-x.net/wp-content/uploads/2009/06/blink-underline.xul'>Исходный текст:</a></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&#34;1.0&#34;</span><span style="color: #000000; font-weight: bold;">?&#62;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;?xml-stylesheet</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&#34;chrome://global/skin&#34;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&#34;text/css&#34;</span><span style="color: #000000; font-weight: bold;">?&#62;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;?xml-stylesheet</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&#34;mycss.css&#34;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&#34;text/css&#34;</span><span style="color: #000000; font-weight: bold;">?&#62;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;window</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&#34;test01.xul&#34;</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&#34;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;groupbox<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;caption</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&#34;Underline problem&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;label</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&#34;color: red;text-decoration: underline&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>Text as element content: underline doesn't work.<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/label<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;label</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&#34;color: red;text-decoration: underline&#34;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&#34;Text as an element attibute: underline works!&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/groupbox<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
&#160;
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;groupbox<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;caption</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&#34;Blink problem&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;label</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&#34;color: red;text-decoration: blink&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>Text as element content: blink works!<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/label<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;label</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&#34;color: red;text-decoration: blink&#34;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&#34;Text as an element attribute: blink doesn't work.&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/groupbox<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/window<span style="color: #000000; font-weight: bold;">&#62;</span></span></span></pre></div></div>

<p>Пример подсмотрен на форуме <a href="http://xulfr.org/forums/read.php?1,10273">xulfr.org</a>.</p>
]]></description>
			<content:encoded><![CDATA[<p>Понадобилось в XUL сделать мигающим текст метки. Попробовал <code>text-decoration:blink</code>&nbsp;&mdash; не работает. Погуглил&nbsp;&mdash; чудеса, оказывается, текст мигает только если он внутри тега <code>label</code>, а не в атрибуте <code>value</code>. Самое смешное, что подчеркивается он строго в обратной ситуации, то есть сделать одновременно мигающий и подчеркнутый текст, похоже, невозможно <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Firefox покажет результат здесь:</p>
<p><iframe src="http://www.all-x.net/wp-content/uploads/2009/06/blink-underline.xul" width="450" height="150" hspace="50" frameborder="1">Если вы видите этот текст, попробуйте прочитать этот пост <a href="http://www.all-x.net/2009/06/17/blink-and-underline-in-xul/">здесь</a>. Если не помогло, значит ваш браузер не поддерживает фреймы.</iframe></p>
<p><a href='http://www.all-x.net/wp-content/uploads/2009/06/blink-underline.xul'>Исходный текст:</a></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml-stylesheet</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;chrome://global/skin&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/css&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml-stylesheet</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;mycss.css&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/css&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;window</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&quot;test01.xul&quot;</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupbox<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;caption</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;Underline problem&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;color: red;text-decoration: underline&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Text as element content: underline doesn't work.<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;color: red;text-decoration: underline&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Text as an element attibute: underline works!&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupbox<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupbox<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;caption</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;Blink problem&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;color: red;text-decoration: blink&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Text as element content: blink works!<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;color: red;text-decoration: blink&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Text as an element attribute: blink doesn't work.&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupbox<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/window<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Пример подсмотрен на форуме <a href="http://xulfr.org/forums/read.php?1,10273">xulfr.org</a>.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=359&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2009/06/17/blink-and-underline-in-xul/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ant+Ivy: закроем тему управления зависимостями при сборке проектов</title>
		<link>http://www.all-x.net/2008/01/01/ant-ivy/</link>
		<comments>http://www.all-x.net/2008/01/01/ant-ivy/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 19:50:00 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Ant]]></category>
		<category><![CDATA[Ivy]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2008/01/01/ant-ivy/</guid>
		<description><![CDATA[<p>За <a href="/2007/07/07/maven-dependencies-for-ant/">полгода</a> в фоновом режиме перевел сборку подконтрольных проектов на <a href="http://ant.apache.org">Ant+Ivy</a>. До этого использовался <a href="http://maven.apache.org">Maven 1</a>, который функционально устраивал, но требовал создания правильного окружения&#160;&#8212; Maven правильной версии, правильный набор плагинов правильных версий, иногда правильно пропатченных. В результате доходило до абсурда&#160;&#8212; один из проектов собирался только на одной машине, попытки воссоздать окружение на другой ни к чему не привели.</p>
<p>Все это подтолкнуло к упрощению процесса сборки&#160;&#8212; переходу обратно на Apache Ant. При этом требования к окружению свелись к минимуму&#160;&#8212; должен быть установлен Sun JDK, Ant правильной версии (1.7) и &#171;большие&#187; библиотеки (типа Eclipse).</p>
<p>Конечно, Ant требует описания процесса сборки для каждого проекта, а в Maven для проектов стандартной структуры стандартная сборка уже описана. Ну что ж, пришлось оформить описание сборки виде библиотеки. Теперь на новый простой проект трачу не больше времени, чем при использовании Maven. Библиотека опубликована под именем <a href="http://treedl.org/repository/buildbase/distributions/">Buildbase</a>, уже достаточно функциональна и стабильна, но как самостоятельный проект не рекламируется.</p>
<p>Второе преимущество Maven&#160;&#8212; управление зависимостями: описание зависимостей, скачивание недостающих артефактов из репозитория и т.п. Сначала я нашел простенькую библиотеку и временно перевел все на нее. Затем разобрался с Ivy и понял, что реализация управления зависимостями в этом инструменте сделана гораздо грамотнее, чем в Maven. Написать про Ivy обещал уже давно, мешала одна непонятность&#160;&#8212; не мог понять, как использовать локальный кэш зависимостей. Месяц назад разобрался и с этим, читайте Getting Started with Ant+Ivy.</p>
<p>Ivy&#160;&#8212; это официальный подпроект Apache Ant. Надеюсь, скоро он переедет из Инкубатора на свое законное место&#160;&#8212; в середине декабря вышла beta1, я же без проблем пользуюсь alpha2.</p>
<p>Подключить Ivy к Ant очень просто, для этого надо:</p>
<ol>
<li>Описать внешние артефакты, необходимые для сборки проекта.</li>
<li>Описать репозитории, из которых эти артефакты можно получить.</li>
<li>Вставить в build.xml вызов задач Ivy, которые обеспечат получение этих артефактов.</li>
</ol>
<p><strong>Делай раз</strong>, файл ivy.xml, который находится в корне проекта (там же, где build.xml):</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ivy-module</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&#34;1.3&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;info</span> <span style="color: #000066;">organisation</span>=<span style="color: #ff0000;">&#34;unitesk&#34;</span> <span style="color: #000066;">module</span>=<span style="color: #ff0000;">&#34;treedl&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;configurations<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;src&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;jar&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;all&#34;</span> <span style="color: #000066;">extends</span>=<span style="color: #ff0000;">&#34;src,jar&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;build&#34;</span> <span style="color: #000066;">visibility</span>=<span style="color: #ff0000;">&#34;private&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;runtime&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/configurations<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;publications<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;artifact</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&#34;jar&#34;</span> <span style="color: #000066;">ext</span>=<span style="color: #ff0000;">&#34;jar&#34;</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;jar&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;artifact</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&#34;src&#34;</span> <span style="color: #000066;">ext</span>=<span style="color: #ff0000;">&#34;zip&#34;</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;src&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;artifact</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&#34;all&#34;</span> <span style="color: #000066;">ext</span>=<span style="color: #ff0000;">&#34;zip&#34;</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;all&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/publications<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;dependencies<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;dependency</span> <span style="color: #000066;">org</span>=<span style="color: #ff0000;">&#34;&#34;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;antlr&#34;</span>        </span>
<span style="color: #009900;">                    <span style="color: #000066;">rev</span>=<span style="color: #ff0000;">&#34;2.7.7&#34;</span>               </span>
<span style="color: #009900;">                    <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;jar-&#62;</span></span>default; runtime-&#62;default&#34;/&#62;
&#160;
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;dependency</span> <span style="color: #000066;">org</span>=<span style="color: #ff0000;">&#34;unitesk&#34;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;atplib&#34;</span>       </span>
<span style="color: #009900;">                    <span style="color: #000066;">rev</span>=<span style="color: #ff0000;">&#34;3.6.5-stable-070809&#34;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;jar-&#62;</span></span>default; runtime-&#62;default&#34;/&#62;
&#160;
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;dependency</span> <span style="color: #000066;">org</span>=<span style="color: #ff0000;">&#34;&#34;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;xml-resolver&#34;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">rev</span>=<span style="color: #ff0000;">&#34;1.2&#34;</span>                 </span>
<span style="color: #009900;">                    <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;all-&#62;</span></span>default; build-&#62;default&#34;/&#62;
&#160;
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;dependency</span> <span style="color: #000066;">org</span>=<span style="color: #ff0000;">&#34;&#34;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;saxon&#34;</span>        </span>
<span style="color: #009900;">                    <span style="color: #000066;">rev</span>=<span style="color: #ff0000;">&#34;6.5.3&#34;</span>               </span>
<span style="color: #009900;">                    <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;all-&#62;</span></span>default; build-&#62;default&#34;/&#62;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/dependencies<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;conflicts<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;manager</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;strict&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/conflicts<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/ivy-module<span style="color: #000000; font-weight: bold;">&#62;</span></span></span></pre></div></div>

<p>В начале перечислены конфигурации проекта&#160;&#8212; собирается ли source distribution (src), jar или полный дистрибутив (all), который включает в себя и то, и другое.<br />
build&#160;&#8212; это конфигурация, которая определяет зависимости, необходимые только при сборке. runtime&#160;&#8212; зависимости, которые потребуются для запуска.<br />
То есть, конфигурации используются для разных целей&#160;&#8212; и для входа, и для выхода. Врать не буду, сильно я в этом не разбирался. Можно, наверное, и еще сократить эту секцию. Впрочем, работает и ладно.</p>
<p>dependency&#160;&#8212; это, собственно, зависимость. Имя, версия&#160;&#8212; тут, вроде, все понятно. По этим атрибутам строится имя артефакта. Если оно другое, внутри dependency можно указать artefact, изучайте документацию.</p>
<p><strong>Делай два</strong>, файл ivyconf.xml, который также находится в корне проекта (там же, где build.xml):</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ivy-module</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&#34;1.3&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ivysettings<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;settings</span> <span style="color: #000066;">defaultResolver</span>=<span style="color: #ff0000;">&#34;chained&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;resolvers<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;chain</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;chained&#34;</span> <span style="color: #000066;">returnFirst</span>=<span style="color: #ff0000;">&#34;true&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;cache</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;cacheResolver&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;url</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;treedl&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;artifact</span> <span style="color: #000066;">pattern</span>=<span style="color: #ff0000;">&#34;http://treedl.org/repository/[artifact]/[type]s/[artifact]-[revision].[ext]&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/url<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ibiblio</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;ibiblio&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/chain<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/resolvers<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/ivysettings<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/ivy-module<span style="color: #000000; font-weight: bold;">&#62;</span></span></span></pre></div></div>

<p>Тут определены репозитории, в которых Ivy будет искать зависимости (вернее, резолверы, которые умеют искать в этих репозиториях. Но уж больно слово неуклюжее, а смысл и так ясен). Начнем с конца.</p>
<ul>
<li>ibiblio&#160;&#8212; это стандартный Maven репозиторий на ibiblio. Если используется только он, ivyconf.xml, вроде, вообще не нужен.</li>
<li>url&#160;&#8212; это удаленный репозиторий, для которого задан шаблон поиска артефактов. Параметрами шаблона являются атрибуты из ivy.xml.</li>
<li>cache&#160;&#8212; это самый нужный репозиторий, который почему-то толком не описан&#160;&#8212; локальный кэш, куда Ivy скачивает зависимости перед тем, как скопировать их в заданную папку проекта.</li>
<li>chain&#160;&#8212; объединяет вышеперечисленные репозитории в список. Если returnFirst="false", то поиск будет производиться по всем перечисленным репозиториям, даже если артефакт уже найден. Поэтому рекомендую ставить returnFirst="true", разрешение зависимостей будет выполняться быстрее.</li>
</ul>
<p><strong>Делай три</strong>, в build.xml добавляем инициализацию Ivy и скачивание зависимостей:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;setup.ivy&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;path</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&#34;ivy.lib.path&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&#34;${ivy.dir}&#34;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&#34;${ivy.jar}&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/path<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;taskdef</span> <span style="color: #000066;">resource</span>=<span style="color: #ff0000;">&#34;fr/jayasoft/ivy/ant/antlib.xml&#34;</span> </span>
<span style="color: #009900;">             <span style="color: #000066;">uri</span>=<span style="color: #ff0000;">&#34;antlib:fr.jayasoft.ivy.ant&#34;</span> </span>
<span style="color: #009900;">             <span style="color: #000066;">classpathref</span>=<span style="color: #ff0000;">&#34;ivy.lib.path&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ivy:settings</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/target<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
&#160;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;get.dependencies&#34;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&#34;setup.ivy&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ivy:settings</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&#34;ivy.instance&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ivy:resolve</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ivy:retrieve</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;runtime&#34;</span> <span style="color: #000066;">pattern</span>=<span style="color: #ff0000;">&#34;${ivy.retrieve.runtime.pattern}&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;ivy:retrieve</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&#34;build&#34;</span> <span style="color: #000066;">pattern</span>=<span style="color: #ff0000;">&#34;${ivy.retrieve.build.pattern}&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/target<span style="color: #000000; font-weight: bold;">&#62;</span></span></span></pre></div></div>

<p>Первая цель определяет задачи, определенные в пространсте имен &#171;ivy&#187;. Вторая&#160;&#8212; скачивание зависимостей:</p>
<ul>
<li>ivy:settings&#160;&#8212; считывание настроек Ivy.</li>
<li>ivy:resolve&#160;&#8212; поиск зависимостей в репозиториях.</li>
<li>ivy:retrieve&#160;&#8212; собственно, скачивание зависимостей для заданной конфигурации. Атрибут pattern задает место назначения для скачанных артефактов. Значения этих атрибутов могут быть примерно такими:

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">ivy.retrieve.runtime.pattern <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> $<span style="">&#123;</span>libs.dir<span style="">&#125;</span>/<span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>artifact<span style="">&#93;</span>.<span style="">&#91;</span>ext<span style="">&#93;</span></span></span>
ivy.retrieve.build.pattern   <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> $<span style="">&#123;</span>tools.dir<span style="">&#125;</span>/<span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>artifact<span style="">&#93;</span>.<span style="">&#91;</span>ext<span style="">&#93;</span></span></span></pre></div></div>

</li>
</ul>
<p>Вот, собственно, и все минимальные дополнительные расходы для автоматического скачивания зависимостей. Можно ещё добавить в build.xml автоматическое скачивание самого Ivy, тогда предустанавливать придется только Ant:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;init.ivy&#34;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&#34;init.properties&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;ivy.version&#34;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&#34;2.0.0-alpha2-incubating&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;ivy.dir&#34;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&#34;${buildbase.basedir}&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;ivy.jar&#34;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&#34;ivy-${ivy.version}.jar&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;dir.ivy.jar&#34;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&#34;${ivy.dir}/${ivy.jar}&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
&#160;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;available</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&#34;ivy.used&#34;</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&#34;${ivy.dep.file}&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
&#160;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;condition</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&#34;ivy.uptodate&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;or<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;not<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;isset</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&#34;ivy.used&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/not<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;available</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&#34;${dir.ivy.jar}&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/or<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/condition<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
&#160;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/target<span style="color: #000000; font-weight: bold;">&#62;</span></span></span>
&#160;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&#34;get.ivy&#34;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&#34;init.ivy&#34;</span> <span style="color: #000066;">unless</span>=<span style="color: #ff0000;">&#34;ivy.uptodate&#34;</span><span style="color: #000000; font-weight: bold;">&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;mkdir</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&#34;${ivy.dir}&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #808080; font-style: italic;">&#60;!-- download Ivy from web site so that it can be used even without any special installation --&#62;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&#34;installing ivy...&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;get</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&#34;http://???????/repository/ivy/jars/${ivy.jar}&#34;</span></span>
<span style="color: #009900;">         <span style="color: #000066;">dest</span>=<span style="color: #ff0000;">&#34;${dir.ivy.jar}&#34;</span></span>
<span style="color: #009900;">         <span style="color: #000066;">usetimestamp</span>=<span style="color: #ff0000;">&#34;true&#34;</span><span style="color: #000000; font-weight: bold;">/&#62;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&#60;/target<span style="color: #000000; font-weight: bold;">&#62;</span></span></span></pre></div></div>

<p><strong>Резюме:</strong> </p>
<ul>
<li>Ivy имеет богатую функциональность и очень гибко настраивается&#160;&#8212; можно приспособить под любые нужды.</li>
<li>Ivy&#160;&#8212; подпроект Apache Ant, что гарантирует развитие и поддержку.</li>
<li>Документация по Ivy в настоящий момент несколько неполна и неактуальна. Есть надежда, что к выходу из Инкубатора ситуация улучшится.</li>
</ul>
]]></description>
			<content:encoded><![CDATA[<p>За <a href="/2007/07/07/maven-dependencies-for-ant/">полгода</a> в фоновом режиме перевел сборку подконтрольных проектов на <a href="http://ant.apache.org">Ant+Ivy</a>. До этого использовался <a href="http://maven.apache.org">Maven 1</a>, который функционально устраивал, но требовал создания правильного окружения&nbsp;&mdash; Maven правильной версии, правильный набор плагинов правильных версий, иногда правильно пропатченных. В результате доходило до абсурда&nbsp;&mdash; один из проектов собирался только на одной машине, попытки воссоздать окружение на другой ни к чему не привели.</p>
<p>Все это подтолкнуло к упрощению процесса сборки&nbsp;&mdash; переходу обратно на Apache Ant. При этом требования к окружению свелись к минимуму&nbsp;&mdash; должен быть установлен Sun JDK, Ant правильной версии (1.7) и &laquo;большие&raquo; библиотеки (типа Eclipse).</p>
<p>Конечно, Ant требует описания процесса сборки для каждого проекта, а в Maven для проектов стандартной структуры стандартная сборка уже описана. Ну что ж, пришлось оформить описание сборки виде библиотеки. Теперь на новый простой проект трачу не больше времени, чем при использовании Maven. Библиотека опубликована под именем <a href="http://treedl.org/repository/buildbase/distributions/">Buildbase</a>, уже достаточно функциональна и стабильна, но как самостоятельный проект не рекламируется.</p>
<p>Второе преимущество Maven&nbsp;&mdash; управление зависимостями: описание зависимостей, скачивание недостающих артефактов из репозитория и т.п. Сначала я нашел простенькую библиотеку и временно перевел все на нее. Затем разобрался с Ivy и понял, что реализация управления зависимостями в этом инструменте сделана гораздо грамотнее, чем в Maven. Написать про Ivy обещал уже давно, мешала одна непонятность&nbsp;&mdash; не мог понять, как использовать локальный кэш зависимостей. Месяц назад разобрался и с этим, читайте Getting Started with Ant+Ivy.</p>
<p>Ivy&nbsp;&mdash; это официальный подпроект Apache Ant. Надеюсь, скоро он переедет из Инкубатора на свое законное место&nbsp;&mdash; в середине декабря вышла beta1, я же без проблем пользуюсь alpha2.</p>
<p>Подключить Ivy к Ant очень просто, для этого надо:</p>
<ol>
<li>Описать внешние артефакты, необходимые для сборки проекта.</li>
<li>Описать репозитории, из которых эти артефакты можно получить.</li>
<li>Вставить в build.xml вызов задач Ivy, которые обеспечат получение этих артефактов.</li>
</ol>
<p><strong>Делай раз</strong>, файл ivy.xml, который находится в корне проекта (там же, где build.xml):</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ivy-module</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.3&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;info</span> <span style="color: #000066;">organisation</span>=<span style="color: #ff0000;">&quot;unitesk&quot;</span> <span style="color: #000066;">module</span>=<span style="color: #ff0000;">&quot;treedl&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configurations<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;src&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;jar&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;all&quot;</span> <span style="color: #000066;">extends</span>=<span style="color: #ff0000;">&quot;src,jar&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;build&quot;</span> <span style="color: #000066;">visibility</span>=<span style="color: #ff0000;">&quot;private&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;conf</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;runtime&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configurations<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;publications<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifact</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;jar&quot;</span> <span style="color: #000066;">ext</span>=<span style="color: #ff0000;">&quot;jar&quot;</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;jar&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifact</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;src&quot;</span> <span style="color: #000066;">ext</span>=<span style="color: #ff0000;">&quot;zip&quot;</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;src&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifact</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;all&quot;</span> <span style="color: #000066;">ext</span>=<span style="color: #ff0000;">&quot;zip&quot;</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;all&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/publications<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependencies<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency</span> <span style="color: #000066;">org</span>=<span style="color: #ff0000;">&quot;&quot;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;antlr&quot;</span>        </span>
<span style="color: #009900;">                    <span style="color: #000066;">rev</span>=<span style="color: #ff0000;">&quot;2.7.7&quot;</span>               </span>
<span style="color: #009900;">                    <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;jar-&gt;</span></span>default; runtime-&gt;default&quot;/&gt;
&nbsp;
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency</span> <span style="color: #000066;">org</span>=<span style="color: #ff0000;">&quot;unitesk&quot;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;atplib&quot;</span>       </span>
<span style="color: #009900;">                    <span style="color: #000066;">rev</span>=<span style="color: #ff0000;">&quot;3.6.5-stable-070809&quot;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;jar-&gt;</span></span>default; runtime-&gt;default&quot;/&gt;
&nbsp;
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency</span> <span style="color: #000066;">org</span>=<span style="color: #ff0000;">&quot;&quot;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;xml-resolver&quot;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">rev</span>=<span style="color: #ff0000;">&quot;1.2&quot;</span>                 </span>
<span style="color: #009900;">                    <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;all-&gt;</span></span>default; build-&gt;default&quot;/&gt;
&nbsp;
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency</span> <span style="color: #000066;">org</span>=<span style="color: #ff0000;">&quot;&quot;</span> </span>
<span style="color: #009900;">                    <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;saxon&quot;</span>        </span>
<span style="color: #009900;">                    <span style="color: #000066;">rev</span>=<span style="color: #ff0000;">&quot;6.5.3&quot;</span>               </span>
<span style="color: #009900;">                    <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;all-&gt;</span></span>default; build-&gt;default&quot;/&gt;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dependencies<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;conflicts<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;manager</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;strict&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/conflicts<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ivy-module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>В начале перечислены конфигурации проекта&nbsp;&mdash; собирается ли source distribution (src), jar или полный дистрибутив (all), который включает в себя и то, и другое.<br />
build&nbsp;&mdash; это конфигурация, которая определяет зависимости, необходимые только при сборке. runtime&nbsp;&mdash; зависимости, которые потребуются для запуска.<br />
То есть, конфигурации используются для разных целей&nbsp;&mdash; и для входа, и для выхода. Врать не буду, сильно я в этом не разбирался. Можно, наверное, и еще сократить эту секцию. Впрочем, работает и ладно.</p>
<p>dependency&nbsp;&mdash; это, собственно, зависимость. Имя, версия&nbsp;&mdash; тут, вроде, все понятно. По этим атрибутам строится имя артефакта. Если оно другое, внутри dependency можно указать artefact, изучайте документацию.</p>
<p><strong>Делай два</strong>, файл ivyconf.xml, который также находится в корне проекта (там же, где build.xml):</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ivy-module</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.3&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ivysettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;settings</span> <span style="color: #000066;">defaultResolver</span>=<span style="color: #ff0000;">&quot;chained&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;resolvers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;chain</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;chained&quot;</span> <span style="color: #000066;">returnFirst</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cache</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;cacheResolver&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;treedl&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifact</span> <span style="color: #000066;">pattern</span>=<span style="color: #ff0000;">&quot;http://treedl.org/repository/[artifact]/[type]s/[artifact]-[revision].[ext]&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ibiblio</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ibiblio&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/chain<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/resolvers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ivysettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ivy-module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Тут определены репозитории, в которых Ivy будет искать зависимости (вернее, резолверы, которые умеют искать в этих репозиториях. Но уж больно слово неуклюжее, а смысл и так ясен). Начнем с конца.</p>
<ul>
<li>ibiblio&nbsp;&mdash; это стандартный Maven репозиторий на ibiblio. Если используется только он, ivyconf.xml, вроде, вообще не нужен.</li>
<li>url&nbsp;&mdash; это удаленный репозиторий, для которого задан шаблон поиска артефактов. Параметрами шаблона являются атрибуты из ivy.xml.</li>
<li>cache&nbsp;&mdash; это самый нужный репозиторий, который почему-то толком не описан&nbsp;&mdash; локальный кэш, куда Ivy скачивает зависимости перед тем, как скопировать их в заданную папку проекта.</li>
<li>chain&nbsp;&mdash; объединяет вышеперечисленные репозитории в список. Если returnFirst="false", то поиск будет производиться по всем перечисленным репозиториям, даже если артефакт уже найден. Поэтому рекомендую ставить returnFirst="true", разрешение зависимостей будет выполняться быстрее.</li>
</ul>
<p><strong>Делай три</strong>, в build.xml добавляем инициализацию Ivy и скачивание зависимостей:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;setup.ivy&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;path</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;ivy.lib.path&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${ivy.dir}&quot;</span> <span style="color: #000066;">includes</span>=<span style="color: #ff0000;">&quot;${ivy.jar}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;taskdef</span> <span style="color: #000066;">resource</span>=<span style="color: #ff0000;">&quot;fr/jayasoft/ivy/ant/antlib.xml&quot;</span> </span>
<span style="color: #009900;">             <span style="color: #000066;">uri</span>=<span style="color: #ff0000;">&quot;antlib:fr.jayasoft.ivy.ant&quot;</span> </span>
<span style="color: #009900;">             <span style="color: #000066;">classpathref</span>=<span style="color: #ff0000;">&quot;ivy.lib.path&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ivy:settings</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;get.dependencies&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;setup.ivy&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ivy:settings</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;ivy.instance&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ivy:resolve</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ivy:retrieve</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;runtime&quot;</span> <span style="color: #000066;">pattern</span>=<span style="color: #ff0000;">&quot;${ivy.retrieve.runtime.pattern}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ivy:retrieve</span> <span style="color: #000066;">conf</span>=<span style="color: #ff0000;">&quot;build&quot;</span> <span style="color: #000066;">pattern</span>=<span style="color: #ff0000;">&quot;${ivy.retrieve.build.pattern}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Первая цель определяет задачи, определенные в пространсте имен &laquo;ivy&raquo;. Вторая&nbsp;&mdash; скачивание зависимостей:</p>
<ul>
<li>ivy:settings&nbsp;&mdash; считывание настроек Ivy.</li>
<li>ivy:resolve&nbsp;&mdash; поиск зависимостей в репозиториях.</li>
<li>ivy:retrieve&nbsp;&mdash; собственно, скачивание зависимостей для заданной конфигурации. Атрибут pattern задает место назначения для скачанных артефактов. Значения этих атрибутов могут быть примерно такими:

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">ivy.retrieve.runtime.pattern <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> $<span style="">&#123;</span>libs.dir<span style="">&#125;</span>/<span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>artifact<span style="">&#93;</span>.<span style="">&#91;</span>ext<span style="">&#93;</span></span></span>
ivy.retrieve.build.pattern   <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> $<span style="">&#123;</span>tools.dir<span style="">&#125;</span>/<span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>artifact<span style="">&#93;</span>.<span style="">&#91;</span>ext<span style="">&#93;</span></span></span></pre></div></div>

</li>
</ul>
<p>Вот, собственно, и все минимальные дополнительные расходы для автоматического скачивания зависимостей. Можно ещё добавить в build.xml автоматическое скачивание самого Ivy, тогда предустанавливать придется только Ant:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;init.ivy&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;init.properties&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ivy.version&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;2.0.0-alpha2-incubating&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ivy.dir&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${buildbase.basedir}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ivy.jar&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;ivy-${ivy.version}.jar&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;dir.ivy.jar&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${ivy.dir}/${ivy.jar}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;available</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;ivy.used&quot;</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ivy.dep.file}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;condition</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;ivy.uptodate&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;or<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;not<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;isset</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;ivy.used&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/not<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;available</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${dir.ivy.jar}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/or<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/condition<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;get.ivy&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;init.ivy&quot;</span> <span style="color: #000066;">unless</span>=<span style="color: #ff0000;">&quot;ivy.uptodate&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mkdir</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${ivy.dir}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #808080; font-style: italic;">&lt;!-- download Ivy from web site so that it can be used even without any special installation --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;installing ivy...&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;get</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;http://???????/repository/ivy/jars/${ivy.jar}&quot;</span></span>
<span style="color: #009900;">         <span style="color: #000066;">dest</span>=<span style="color: #ff0000;">&quot;${dir.ivy.jar}&quot;</span></span>
<span style="color: #009900;">         <span style="color: #000066;">usetimestamp</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><strong>Резюме:</strong> </p>
<ul>
<li>Ivy имеет богатую функциональность и очень гибко настраивается&nbsp;&mdash; можно приспособить под любые нужды.</li>
<li>Ivy&nbsp;&mdash; подпроект Apache Ant, что гарантирует развитие и поддержку.</li>
<li>Документация по Ivy в настоящий момент несколько неполна и неактуальна. Есть надежда, что к выходу из Инкубатора ситуация улучшится.</li>
</ul>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=112&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2008/01/01/ant-ivy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SCM для WordPress</title>
		<link>http://www.all-x.net/2007/06/10/scm-for-wordpress/</link>
		<comments>http://www.all-x.net/2007/06/10/scm-for-wordpress/#comments</comments>
		<pubDate>Sun, 10 Jun 2007 19:43:15 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2007/06/10/scm-for-wordpress/</guid>
		<description><![CDATA[<p>Вот вникаю я потихоньку в то, как жизнь с <a href="http://wordpress.org/">WordPress</a> (WP) устроена, форумы читаю всякие... И вижу, что настройка часто требует изменений в коде самого WP, в частности&#160;&#8212; в используемой теме. Но почему-то никто не упоминает, что держит код своего WP в какой-нибудь системе Source Configuration Management (SCM), типа <a href="http://www.cvs.ru">CVS</a> или <a href="http://subversion.tigris.org/">Subversion</a>.</p>
<p>То ли владельцы блогов по большей части далеки от знания стандартного программистского инструментария, то ли это настолько само собой разумеется, что все молчат. И хаки всякие распространяются не в стандартной форме патчей, а в виде словесного описания.</p>
<p>В общем, в моем списке дел появились две записи:</p>
<ol>
<li>Упрятать код WP этого сайта в Subversion.</li>
<li>Найти удобную PHP IDE. (<a href="http://www.phpeclipse.de">PHPEclipse</a>?)</li>
</ol>
]]></description>
			<content:encoded><![CDATA[<p>Вот вникаю я потихоньку в то, как жизнь с <a href="http://wordpress.org/">WordPress</a> (WP) устроена, форумы читаю всякие... И вижу, что настройка часто требует изменений в коде самого WP, в частности&nbsp;&mdash; в используемой теме. Но почему-то никто не упоминает, что держит код своего WP в какой-нибудь системе Source Configuration Management (SCM), типа <a href="http://www.cvs.ru">CVS</a> или <a href="http://subversion.tigris.org/">Subversion</a>.</p>
<p>То ли владельцы блогов по большей части далеки от знания стандартного программистского инструментария, то ли это настолько само собой разумеется, что все молчат. И хаки всякие распространяются не в стандартной форме патчей, а в виде словесного описания.</p>
<p>В общем, в моем списке дел появились две записи:</p>
<ol>
<li>Упрятать код WP этого сайта в Subversion.</li>
<li>Найти удобную PHP IDE. (<a href="http://www.phpeclipse.de">PHPEclipse</a>?)</li>
</ol>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=22&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2007/06/10/scm-for-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Collaborative Software Development</title>
		<link>http://www.all-x.net/2007/06/09/collaborative-software-development/</link>
		<comments>http://www.all-x.net/2007/06/09/collaborative-software-development/#comments</comments>
		<pubDate>Sat, 09 Jun 2007 05:25:56 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[forge]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2007/06/09/collaborative-software-development/</guid>
		<description><![CDATA[<p>Вот какие бывают web-based движки для организации совместной разработки ПО:</p>
<p><a href="http://www.collab.net/" class="linkification-ext" title="Linkification: http://www.collab.net/">http://www.collab.net/</a>&#160;&#8212; CollabNet (бесплатно на 15 разработчиков)</p>
<p><a href="http://gforge.org/" class="linkification-ext" title="Linkification: http://gforge.org/">http://gforge.org/</a>&#160;&#8212; GForge (бесплатно на 15 разработчиков)</p>
<p><a href="https://gna.org/projects/savane/" class="linkification-ext" title="Linkification: https://gna.org/projects/savane/">https://gna.org/projects/savane/</a>&#160;&#8212; Savane (<a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License V2 or later</a>, количество разработчиков неограничено)</p>
<p>Вспомните <a href="http://sourceforge.net/" class="linkification-ext" title="Linkification: http://sourceforge.net">http://sourceforge.net</a> чтобы понять, что эти продукты такое в первом приближении.</p>
<p>Все хотят LAMP (Linux, Apache, MySQL, PHP). Но Savane удалось установить на Windows 2003 Server (по крайней мере frontend). Доработка напильником потребовалась, но хватило и моих нулевых навыков в этой области.</p>
]]></description>
			<content:encoded><![CDATA[<p>Вот какие бывают web-based движки для организации совместной разработки ПО:</p>
<p><a href="http://www.collab.net/" class="linkification-ext" title="Linkification: http://www.collab.net/">http://www.collab.net/</a>&nbsp;&mdash; CollabNet (бесплатно на 15 разработчиков)</p>
<p><a href="http://gforge.org/" class="linkification-ext" title="Linkification: http://gforge.org/">http://gforge.org/</a>&nbsp;&mdash; GForge (бесплатно на 15 разработчиков)</p>
<p><a href="https://gna.org/projects/savane/" class="linkification-ext" title="Linkification: https://gna.org/projects/savane/">https://gna.org/projects/savane/</a>&nbsp;&mdash; Savane (<a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License V2 or later</a>, количество разработчиков неограничено)</p>
<p>Вспомните <a href="http://sourceforge.net/" class="linkification-ext" title="Linkification: http://sourceforge.net">http://sourceforge.net</a> чтобы понять, что эти продукты такое в первом приближении.</p>
<p>Все хотят LAMP (Linux, Apache, MySQL, PHP). Но Savane удалось установить на Windows 2003 Server (по крайней мере frontend). Доработка напильником потребовалась, но хватило и моих нулевых навыков в этой области.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=10&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2007/06/09/collaborative-software-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
