<?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>blog.grejpfrut.org &#187; maven</title>
	<atom:link href="http://grejpfrut.org/blog/tag/maven/feed/" rel="self" type="application/rss+xml" />
	<link>http://grejpfrut.org/blog</link>
	<description>a DRY KISS</description>
	<lastBuildDate>Fri, 22 Jan 2010 20:58:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>m2eclipse plugin problem</title>
		<link>http://grejpfrut.org/blog/2007/01/20/m2eclipse-plugin-problem/</link>
		<comments>http://grejpfrut.org/blog/2007/01/20/m2eclipse-plugin-problem/#comments</comments>
		<pubDate>Sat, 20 Jan 2007 21:03:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[m2eclipse]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://maneo.webd.pl/blog/?p=24</guid>
		<description><![CDATA[Od jakiegoś czasu pracując z m2 pod Eclipse używam m2eclipse plugin, oferuje on kilka przydatnych funkcjonalności: 

 możemy obdarzyć projekt mavenową naturą, jest wizard który po wypełnieniu prostego formularza tworzy pom
 możemy przeglądać sobie lokalne i zdalne repozytoria w poszukiwaniu zależności, 
po ich wybraniu odpowiedni xml sam dodaje się do pom&#8217;a naszego projektu,
 poza tym [...]]]></description>
			<content:encoded><![CDATA[<p><b>Od jakiegoś czasu</b> pracując z m2 pod Eclipse używam <a href="http://m2eclipse.codehaus.org/">m2eclipse plugin</a>, oferuje on kilka przydatnych funkcjonalności: </p>
<ul>
<li> możemy obdarzyć projekt mavenową naturą, jest wizard który po wypełnieniu prostego formularza tworzy pom</li>
<li> możemy przeglądać sobie lokalne i zdalne repozytoria w poszukiwaniu zależności, </li>
<li>po ich wybraniu odpowiedni xml sam dodaje się do pom&#8217;a naszego projektu,</li>
<li> poza tym m2 jest w Eclipse dostępny jako build tool zupełnie jak Ant</li>
</ul>
<p><b>Na stronie projektu</b> są dwa screencasty : <a href="http://m2eclipse.codehaus.org/Installing_Maven_2.0_plugin_for_Eclipse.html">instalacja</a>, oraz <a href="http://m2eclipse.codehaus.org/Maven_2.0_Plugin_for_Eclipse.html">użytkowanie</a>. Jednym słowem prawie Netbeans <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p><b>Skonfigurowałem sobie m2</b> tak, że katalog lokalnego repozytorium <b>nie znajduję się w domyślnej lokalizacji</b> <code>userhome/.m2/repository</code> tylko w tym samym katalogu co m2 <code>M2HOME/repo</code>. Jeżeli ktoś chciałby sobie zrobić coś podobnego, wystarczy odkomentować w <code>M2HOME/conf/settings.xml</code> znacznik  <code>localRepository</code> i wpisać tam odpowiednią ścieżkę. Gdy zainstalowałem m2eclipse na komputerze w domu (w pracy m2 działa w domyślnej konfiguracji więc problemów z tą wtyczką nie miałem) Eclipse nie za bardzo chciał się pogodzić z nową sytuacją <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Po wybraniu  <code>Maven2</code> w menu <code>Window/Preferences</code> Eclipse&#8217;a, pojawiał się komunikat o błędzie. Poszukałem trochę i znalazłem w czym problem <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . </p>
<p><b>Problem dotyczy</b> błędu <a href="http://jira.codehaus.org/browse/MNGECLIPSE-124">MNGECLIPSE-124</a>, m2eclipse plugin ma w sobie zawartego całego m2. Zgodnie z tym co napisał w komentarzu do tego zadania <a href="http://jira.codehaus.org/browse/MNGECLIPSE-124#action_78146">William Ferguson</a> wygląda na, że zawarty w pluginie m2 nie czyta konfiguracji z <code>M2_HOME/conf/settings.xml</code>.  Jeżeli ktoś chce wiedzieć więcej odsyłam do komentarzy  do tego bug&#8217;a. Najprostszym rozwiązaniem tego problemu jest wrzucenie kopii <code>M2_HOME/conf/settings.xml</code> do <code>userhome/.m2/</code> u mnie po tej operacji plugin śmiga. </p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2007/01/20/m2eclipse-plugin-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Posse #070 &#8211; Interview with Brett Porter of Maven</title>
		<link>http://grejpfrut.org/blog/2006/11/24/java-posse-070-interview-with-brett-porter-of-maven/</link>
		<comments>http://grejpfrut.org/blog/2006/11/24/java-posse-070-interview-with-brett-porter-of-maven/#comments</comments>
		<pubDate>Fri, 24 Nov 2006 10:57:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[javaposse]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://maneo.webd.pl/blog/?p=18</guid>
		<description><![CDATA[
Wprawdzie wywiad nie jest już pierwszej świeżości, ale dopiero teraz znalazłem chwilę żeby sobie ściągnąć tego podcast&#8217;a. Myśle, że warto  tego w wolnej chwili posłuchać (zresztą jak większości podcast&#8217;ów z Java Posse). O czym jest mowa?

Czym jest maven? jakie są podstawowe założenia i zastosowania
Pytanie bumerang: maven vs ant  
Dlaczego warto przyjrzeć się bliżej [...]]]></description>
			<content:encoded><![CDATA[<p>
<b>Wprawdzie wywiad</b> nie jest już pierwszej świeżości, ale dopiero teraz znalazłem chwilę żeby sobie ściągnąć tego podcast&#8217;a. Myśle, że warto  tego w wolnej chwili posłuchać (zresztą jak większości podcast&#8217;ów z <a href="http://javaposse.com/">Java Posse</a>). O czym jest mowa?</p>
<ul>
<li>Czym jest maven? jakie są podstawowe założenia i zastosowania</li>
<li>Pytanie bumerang: maven vs ant <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Dlaczego warto przyjrzeć się bliżej maven&#8217;owi?</li>
<li>Wzorce i konwencje w budowaniu projektów.</li>
<li>Czy i jak maven zwiększa produktywność.</li>
<li>Integracja istniejących skryptów ant&#8217;owych z maven&#8217;em.</li>
<li>Różnice między m1.x i m2.</li>
<li>Jak komercyjne projekty odnoszą się do maven&#8217;a</li>
<li>Integracja z IDE.</li>
<li>Nad czym maven team pracuje (pracował <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</li>
<li>Jaką role w maven project pełni Mergere.</li>
</ul>
<p>
No i link <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="">Java Posse #070 &#8211; Interview with Brett Porter of Maven</a>. Wygląda na to, że tematy związane z maven&#8217;em jednak jeszcze się pojawią w najbliższej przyszłości <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2006/11/24/java-posse-070-interview-with-brett-porter-of-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M2: Tworzymy stronę projektu</title>
		<link>http://grejpfrut.org/blog/2006/11/21/m2-tworzymy-strone-projektu/</link>
		<comments>http://grejpfrut.org/blog/2006/11/21/m2-tworzymy-strone-projektu/#comments</comments>
		<pubDate>Tue, 21 Nov 2006 21:15:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[maven-site-plugin]]></category>

		<guid isPermaLink="false">http://maneo.webd.pl/blog/?p=17</guid>
		<description><![CDATA[
Gdy zaczynałem swoje przygody z maven&#8217;em wydawało mi się, że głównym powodem dla którego warto użyć w projekcie maven&#8217;a jest to że sam generuje stronę dla projektu  . W m1.x można było za pomocą goal&#8217;a site wygenerować nie tylko stronę projektu, ale również (a może przede wszystkim) raporty oparte na statycznej analizie kodu, opis [...]]]></description>
			<content:encoded><![CDATA[<p>
<b>Gdy zaczynałem swoje przygody</b> z maven&#8217;em wydawało mi się, że głównym powodem dla którego warto użyć w projekcie maven&#8217;a jest to że sam generuje stronę dla projektu <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . W m1.x można było za pomocą goal&#8217;a site wygenerować nie tylko stronę projektu, ale również (a może przede wszystkim) raporty oparte na statycznej analizie kodu, opis zależności, statystyki związane z repozytorium. W m2 część z raportów jest wciąż niedostępna, a żeby użyć innych musiałem posiłkować się wersjami pluginów wprost z repozytorium. Krok po kroku zbudujemy sobie taką stronkę&#8230;
</p>
<p>
Jak już wspomniałem <b>do tworzenia strony w m2 używa się plugin&#8217;a site</b> korzystając z projekty który wygenerowaliśmy w poprzednich postach możemy sprawdzić jak to działa. W katalogu głównym wystarczy wydać polecenie <code>mvn site</code>, m2 swoim zwyczajem ściągnie pół internetu <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Gdy skończy w target/site będziemy mieli wygenerowaną stronkę dla naszego projektu. Rzeczy dotyczące samego projektu jak: adres strony, opis, adres repozytorium, deweloperzy którzy biorący udział w projekcie, zależności projektu należy umieścić w pom.xml (kompletna referencja <a href="http://maven.apache.org/pom.html">tutaj</a> naprawdę warto się zapoznać).
</p>
<p>
<b>Czas dostosować stronkę do naszych potrzeb</b>, jeżeli chcemy dodać trochę swoich własnych linków, jakąś dokumentację dotyczącą naszego projektu musimy stworzyć dodatkowy katalog w strukturze naszego projektu /src/site a w nim stworzyć plik site.xml. Przykładową zawartość (jak i całe objaśnienie możecie znaleźć <a href="http://maven.apache.org/guides/mini/guide-site.html">tutaj</a>) nie jest to specjalnie wyuzdane <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Na tej samej stronie znajdziecie informacje także o katalogu /src/site/apt w którym przechowywana jest w formacie apt treść która będzie później umieszczona na stronie.  APT czyli almost plain text to format który za pomocą kilku prostych konstrukcji (podobnie jak w wiki) pozwoli stworzyć przyzwoicie wyglądający dokument (<a href="http://maven.apache.org/guides/mini/guide-apt-format.html">zobacz tu</a>). Site plugin pozwala tworzyć kilka wersji językowych naszej strony, wszystko dość dokładnie opisane na <a href="http://maven.apache.org/guides/mini/guide-site.html">wspomnianej wyżej stronie</a>. Znalazłem też na stronie samego pluginu kilka słów na temat tworzenia własnych skór dla generowanych przez m2 stron &#8211; <a href="http://maven.apache.org/plugins/maven-site-plugin/creating-a-skin.html">zobacz tu</a>
</p>
<p>
Teraz to co najsmaczniejsze &#8211; <b>raporty z statycznych analiz kodu</b>. W m2 udało mi się użyć następujących raportów: <a href="http://maven-plugins.sourceforge.net/maven-findbugs-plugin/">findbugs</a>, <a href="http://maven.apache.org/maven-1.x/plugins/checkstyle/">checkstyle</a>, <a href="http://pmd.sourceforge.net/maven-plugin.html">pmd</a>, <a href="http://maven.apache.org/plugins/maven-dependency-plugin/cpd.html">cpd</a>. Checkstyle w czasach gdy nawet dziecko wie do czego służy ctrl+shift+f pod <a href="http://eclipse.org">eclipse</a> traci trochę na znaczeniu, nie mniej wydaje mi się wart tych kilku linijek xml&#8217;a w pom&#8217;ie. To co zostanie wygenerowane nie będzie miało pełnej wartości jeżeli nie dorzucimy jeszcze dwóch rzeczy: <a href="http://maven.apache.org/plugins/maven-jxr-plugin/">jxr</a> i <a href="http://maven.apache.org/plugins/maven-javadoc-plugin/index.html">javadoc</a>. Pierwszy z nich generuje html&#8217;ową wersje kodu źródłowego tak aby można było odwoływać się do konkretnej linii. Jest to dośc przydatne ponieważ pozostałe raporty (jak np. pmd) w wygenerowanych zestawieniach linkują konkretne miejsce w kodzie i możemy zobaczyć o co dokładnie chodzi. Javadoc nie wymaga chyba komentarza <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Aby włączyć te raporty do strony naszego projektu musimy w pom.xml stworzyć sekcje <code>reporting</code>. Przykładową realizację możecie znaleźć w <a href="http://calypso.cs.put.poznan.pl/project/weed/browser/trunk/WeedProject/pom.xml">tutaj</a>. Należy zwrócić uwagę na jeszcze jedną sekcje</p>
<pre class="brush: xml;">
 &lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
      &lt;id&gt;codehaus-snapshots&lt;/id&gt;
      &lt;name&gt;Codehaus snapshots&lt;/name&gt;
      &lt;url&gt;http://snapshots.maven.codehaus.org/maven2/&lt;/url&gt;
    &lt;/pluginRepository&gt;
  &lt;/pluginRepositories&gt;
</pre>
<p>Tak jak mówiłem na samym początku w chwili gdy tworzyłem tego pom&#8217;a bez snapshotów nie dało się tych raportów stworzyć, być teraz problem jest już nieaktualny. Gdy już przygotujemy naszego pom&#8217;a <code>mvn site</code> i pozstaje już tylko poprawiać błędy znalezione przez m2 <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Więcej o pluginie raportującym <a href="http://maven.apache.org/plugins/maven-project-info-reports-plugin/howto.html">tutaj</a>. Ostatnia praktyczna rada, często wykonanie <code>mvn site</code> może trwać dłuższą chwilę, jeżeli zależy nam na wynikach konkretnego raportu. Warto wiedzieć, że każdy raport można wywołać z linii poleceń np. <code>mvn checkstyle:checkstyle</code>.
</p>
<p>
<b>To ostatni post nt. m2 &#8211; przynajmniej narazie <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </b> myśle, że po zapoznaniu się z linkami które umieściłem w tych postach każdy zyska już odpowiednią biegłość w wyszukiwaniu informacji na stronach mavena. Mam nadzieje, że komuś się to przyda.</p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2006/11/21/m2-tworzymy-strone-projektu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Better Builds with Maven&#8221;</title>
		<link>http://grejpfrut.org/blog/2006/11/20/better-builds-with-maven/</link>
		<comments>http://grejpfrut.org/blog/2006/11/20/better-builds-with-maven/#comments</comments>
		<pubDate>Mon, 20 Nov 2006 20:05:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[recenzja]]></category>

		<guid isPermaLink="false">http://maneo.webd.pl/blog/?p=15</guid>
		<description><![CDATA[
Już od kilku miesięcy można ściągnąć darmową książke nt. m2, &#8220;Better Builds with Maven&#8221; to kooperacja ludzi którzy maven&#8217;a tworzą, więc teoretycznie informacje z pierwszej ręki. 

W październiku ukazała się wersja 1.1 autorzy obiecują, że wiele spośród błędów które pojawiły się w oryginale zostało poprawionych, zdanie nt. tej książki ludzie mają różne. Na pierwszy rzut [...]]]></description>
			<content:encoded><![CDATA[<p>
<b>Już od kilku miesięcy</b> można ściągnąć darmową książke nt. m2, <b>&#8220;Better Builds with Maven&#8221;</b> to kooperacja ludzi którzy maven&#8217;a tworzą, więc teoretycznie informacje z pierwszej ręki. </p>
<p>
<b>W październiku ukazała się wersja 1.1</b> autorzy obiecują, że wiele spośród błędów które pojawiły się w oryginale zostało poprawionych, zdanie nt. tej książki ludzie mają <a href="http://mail-archives.apache.org/mod_mbox/maven-users/200607.mbox/%3Ca753b7f80607150910h12d92919k9851861cd58bf4c7@mail.gmail.com%3E">różne</a>. Na pierwszy rzut oka książka bardzo przypomina to co można znaleźć na stronach <a href="http://maven.apache.org">maven.apache.org</a>, zobaczymy co będzie przy bliższym poznaniu. Można ssać <a href="http://www.mergere.com/m2book_download.jsp">stąd</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2006/11/20/better-builds-with-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M2: zdalne repozytorium</title>
		<link>http://grejpfrut.org/blog/2006/05/05/m2-zdalne-repozytorium/</link>
		<comments>http://grejpfrut.org/blog/2006/05/05/m2-zdalne-repozytorium/#comments</comments>
		<pubDate>Fri, 05 May 2006 21:51:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://maneo.webd.pl/blog/?p=16</guid>
		<description><![CDATA[Zarządzanie zależnościami w m2 opisałem już szczątkowo w poprzednich postach, dokładny opis z przykładami możecie znaleźć na tej stronie.
W tym poście chciałbym krótko omówić strukturę repozytorium m2, mimo istnienia kilku centralnych, dużych repozytoriów warto dla swojego projektu stworzyć własne. Powodów po temu może być kilka:

nasz projekt używa bibliotek których na ibiblio.org próżno szukać (np. jakiś [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Zarządzanie zależnościami w m2</strong> opisałem już szczątkowo w poprzednich postach, dokładny opis z przykładami możecie znaleźć na <a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html">tej stronie</a>.</p>
<div id="attachment_70" class="wp-caption alignright" style="width: 224px"><a href="http://grejpfrut.org/test/wordpress/wp-content/uploads/2009/06/repodirs.png"><img class="size-full wp-image-70" title="repodirs" src="http://grejpfrut.org/test/wordpress/wp-content/uploads/2009/06/repodirs.png" alt="struktura repozytorium Maven" width="214" height="273" /></a><p class="wp-caption-text">struktura repozytorium Maven</p></div>
<p>W tym poście chciałbym krótko omówić strukturę repozytorium m2, mimo istnienia kilku centralnych, dużych repozytoriów warto dla swojego projektu stworzyć własne. Powodów po temu może być kilka:</p>
<ul>
<li>nasz projekt używa bibliotek których na ibiblio.org próżno szukać (np. jakiś zapomniany projekt studencki <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</li>
<li> stworzenie repozytorium na projektowym serwerze przypuszczalnie znacznie przyspieszy download artefaktów (ibiblio bywa obciążone)</li>
<li> w przypadku awarii centralnego repozytorium (co miało jakiś czas temu miejsce <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) możemy spokojnie dalej pracować</li>
</ul>
<p><strong>Czego potrzeba zeby stworzyc repozytorium maven2?</strong> Naprawde niewiele: trochę miejsca na serwerze, potrzebujemy katalog dostępny (dajacy sie wylistować) z www. Teraz trzeba wrzucić jar’y i pliki pom tak aby były zgodne z ustalona struktura katalogow. Korzeń zaprezentowanego poniżej systemu plików (lucene) to groupId zależności, na groupId nie musi się składać tylko jeden poziom katalogów (w przypadku lucene wygląda to tak: org/apache/lucene/lucene-core). Lucene-core to nazwa artefaktu, na poziomie niżej znajdują się konkretne wersje. Każdy artefakt musi mieć dołączoną sumę kontrolną w plikach md5, sha1. Każdy czyli: pom, jar i wszystko inne (xml). Co zresztą widać na powyższym obrazku.</p>
<p>Dwa słowa o plikach metadanych, w katalogu głównym wyglądać on może tak:</p>
<pre class="brush: xml;">
  &lt;metadata&gt;
     &lt;groupId&gt;lucene&lt;/groupId&gt;
     &lt;artifactId&gt;lucene-core&lt;/artifactId&gt;
     &lt;version&gt;2.0.0&lt;/version&gt;
     &lt;versioning&gt;
  	   &lt;versions&gt;
            &lt;version&gt;2.0.0&lt;/version&gt;
            &lt;version&gt;1.9.1&lt;/version&gt;
           &lt;/versions&gt;
     &lt;/versioning&gt;
   &lt;/metadata&gt;
</pre>
<p>w katalogu wersji troche inaczej:</p>
<pre class="brush: xml;">
   &lt;metadata&gt;
     &lt;groupId&gt;lucene&lt;/groupId&gt;
     &lt;artifactId&gt;lucene-core&lt;/artifactId&gt;
     &lt;version&gt;2.0.0&lt;/version&gt;
   &lt;/metadata&gt;
</pre>
<p><strong>W m2 można zadeklarować zakres zależności</strong>, w polu version artefaktu wpisujemy np. [1.2,1.3] co oznacza, że nasz projekt będzie działać z wersjami 1.2 lub 1.3. Domyślnie m2 zaciągnie najnowszą wersje biblioteki, ale gdyby któraś z zależności przechodnich określała w swoim pom’ie, że z najnowszą wersją nie poleci m2 wybierze tą z która działać będzie wszystko. (więcej <a href="http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution">tu</a>)Padło magiczne hasło… zależności przechodnie! grr.. Każdy pewnie kiedyś gdzieś zobaczył ClassNotFoundException <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , dodaliśmy do naszego projektu bibliotekę, a po uruchomieniu zamiast efektów widzimy wyjątki. M2 oferuje swój całkiem sprawny mechanizm zawiadywania zależnościami przechodnimi dzięki temu, że do każdego projektu w repo dołączany jest pom z opisem zależności każdego projektu, m2 może podczas ściągania zależności przejrzeć sobie je i dodać zależności zależności <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>Podsumowując</strong> musimy stworzyć odpowiednią strukturę katalogów, dodać pliki metadanych, dołączyć do tego wszystkiego sumy kontrolne i wrzucić na serwer. Wbrew pozorom jest trochę z tym roboty, istnieje wtyczka repository która udostępnia polecenie bundle-create. Nie użyłem jej nigdy, wymaga ona wypełnienia w pom.xml takich rzeczy jak scm, licencja (opis <a href="http://maven.apache.org/guides/mini/guide-ibiblio-upload.html">tutaj</a>). Strukturę katalogów tworzę więc ręcznie a do podpisywania plików stworzyłem sobie prosty plik ant’owy (gdyby ktoś znał jakiś prostszy sposób, to dajcie znać <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p>Gdy stworzymy już <strong>nasze projektowe repozytorium</strong> musimy jeszcze dodać jedną rzecz w pom.xml projektu:</p>
<pre class="brush: xml;">
    &lt;repositories&gt;
       &lt;repository&gt;
         &lt;id&gt;our-project-repo&lt;/id&gt;
         &lt;name&gt;Our project repo&lt;/name&gt;
         &lt;url&gt;http://our.project.org/maven_repo&lt;/url&gt;
       &lt;/repository&gt;
     &lt;/repositories&gt;
</pre>
<p><strong>To w zasadzie wszystko</strong>, jest jeszcze jedna ciekawostka <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  w m2 można też używać repozytoriów m1.x. Zauważyłem to dopiero przy przeglądaniu referencji do <a href="http://maven.apache.org/ref/2.0.3-SNAPSHOT/maven-model/maven.html">pom.xml</a>. W sekcji repository jest możliwość wyspecyfikowania tag’a <code>layout</code> możemy mu przypisać wartość <code>default</code> albo <code>legacy</code>. Stosunkowo prościej stworzyć repo w starym formacie (nie ma sum kontrolnych, plików metadanych), ale też takie repo nie obsłuży przechodnich zależności czy zakresów wersji. Coś za coś <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2006/05/05/m2-zdalne-repozytorium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M2: tworzenie wersji dystrybucyjnej</title>
		<link>http://grejpfrut.org/blog/2006/04/20/m2-tworzenie-wersji-dystrybucyjnej/</link>
		<comments>http://grejpfrut.org/blog/2006/04/20/m2-tworzenie-wersji-dystrybucyjnej/#comments</comments>
		<pubDate>Thu, 20 Apr 2006 19:37:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://maneo.webd.pl/blog/?p=14</guid>
		<description><![CDATA[
Hmmm&#8230;   maven to elastyczne narzędzie, żeby osiągnąć zamierzony cel trzeba czasami przebić się przez całkiem sporo nakonfigurować. W dzisiejszym odcinku   będzie o trzech pluginach: assembly, jar i antrun. W maven 1.x było wszechobecne Jelly, chciałem się przekonać jak będzie wyglądało tworzenie wersji dystrybucyjnej w m2.


Zacznijmy od projektu który wygenerowaliśmy poprzednim razem, [...]]]></description>
			<content:encoded><![CDATA[<p>
<b>Hmmm&#8230; <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  maven to elastyczne narzędzie</b>, żeby osiągnąć zamierzony cel trzeba czasami przebić się przez całkiem sporo nakonfigurować. W dzisiejszym odcinku <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  będzie o trzech pluginach: assembly, jar i antrun. W maven 1.x było wszechobecne Jelly, chciałem się przekonać jak będzie wyglądało tworzenie wersji dystrybucyjnej w m2.
</p>
<p>
<b>Zacznijmy od projektu</b> który wygenerowaliśmy poprzednim razem, jeżeli chcielibyśmy wygenerować teraz jar&#8217;a wystarczy wydać polecenie <code>mvn package</code>. M2 bez żadnych problemów stworzy nam jar&#8217;a, teraz dodajmy do naszego projektu jakieś zasoby. Aby zasoby były bezproblemowo dołączone do jar&#8217;a musimy stworzyć katalog $project.base.dir/src/main/resources i wszystkie zasoby wrzucać właśnie do niego. Po utworzeniu jar&#8217;a zostaną one przekopiowane do podstawowej ścieżki archiwum.
</p>
<p>
Gdy zajdzie konieczność <b>zmiany manifestu jar&#8217;a</b> to wedle mojej skromnej wiedzy musimy pogrzebać trochę w konfiguracji maven-jar-plugin. Można to zrobić specyfikując w pom.xml następujący blok:</p>
<pre class="brush: xml;">
&lt;build&gt;
     ...
    &lt;plugins&gt;
     &lt;plugin&gt;
      &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
      &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;
      &lt;configuration&gt;
	 &lt;archive&gt;
	   &lt;manifest&gt;
	     &lt;addClasspath&gt;true&lt;/addClasspath&gt;
	     &lt;addExtensions&gt;true&lt;/addExtensions&gt;
	     &lt;classpathPrefix&gt;./lib/&lt;/classpathPrefix&gt;
 	     &lt;mainClass&gt;org.grejpfrut.App&lt;/mainClass&gt;
             &lt;packageName&gt;org.grejpfrut&lt;/packageName&gt;
	   &lt;/manifest&gt;
 	 &lt;/archive&gt;
      &lt;/configuration&gt;
     &lt;/plugin&gt;
    &lt;/plugins&gt;
    ...

  &lt;build&gt;
</pre>
<p><b>Cała magia</b> siedzi wewnątrz sekcji <code>&lt;configuration&gt;</code> tutaj specyfikujemy, że do manifestu ma być dodana informacja o classpath, tag classpathPrefix instruuje maven-jar-plugin aby przed każdą zależnością dostawiał ścieżke <code>./lib</code> (np. <code>./lib/log4j-1.2.13.jar</code>). Takie rozwiązanie pozwala utrzymać porządek w katalogu dystrybucji i rozdzielić główny jar od jego zależności. Pozostałe parametry nie wymagają wyjaśnień.
</p>
<p>
Aby sprawdzić poprawność manifestu możemy użyć kodu App.java który podałem w poście o maven 1.x, należy uaktualnić plik <code>pom.xml</code> o opis <code>log4j</code> w sekcji dependencies i wydać polecenie <code>mvn package</code>. Po rozpakowaniu jar&#8217;a możemy podejrzeć plik <code>Meta-inf/Manifest.mf</code>. W katalogu Meta-inf maven umieszcza kopie pom.xml oraz plik pom.properties który zawiera najbardziej podstawowe informacje o projekcie (wersja, artifactId, groupId). Po co te pliki? </p>
<p><i>&#8220;The pom.xml and pom.properties files are packaged up in the JAR so that each artifact produced by Maven is self-describing and also allows you to utilize the metadata in your own application if the need arises. One simple use might be to retrieve the version of your application.&#8221;</i><a href="http://maven.apache.org">maven.apache.org</a>
</p>
<p>
<b>Wyobrażmy sobie jednak</b>, że pojawia się kolejny problem&#8230; mianowicie w przypadku zasobów związanych z umiedzynarodowieniem naszej aplikacji bywa, że properties muszą znajdować się w katalogu src w katalogu związanym z odpowiednim pakietem. Problem ten wystąpi zawsze gdy będziemy chcieli umieścić zasoby w katalogu innym niż wposmniane wcześniej src/main/resources (bądź działającym na tej podobnej zasadzie src/test/resources). W czasie tworzenia jar&#8217;a m2 po prostu nie przekopiuje niczego poza skompilowanymi klasami. Zastosowane przez nas rozwiązanie zostało oparte o ant&#8217;a.
</p>
<p> <b>W m2 wszystko związane jest z fazami</b> i cyklem zycia oprogramowania. W starym mavenie specyfikowaliśmy sekcje post i pregoal w maven.xml. W m2 aby użyć jakiegoś celu/wtyczki który nie należy do zdefiniowanego cyklu budowania musimy go zadeklarować w pom.xml. Tak też musimy postąpić z maven-antrun-plugin.</p>
<pre class="brush: xml;">
    &lt;plugin&gt;
      &lt;artifactId&gt;maven-antrun-plugin&lt;/artifactId&gt;
      &lt;executions&gt;
        &lt;execution&gt;
	   &lt;phase&gt;compile&lt;/phase&gt;
	   &lt;configuration&gt;
	    &lt;tasks&gt;
		&lt;copy todir=&quot;${basedir}/target/classes/&quot;&gt;
	  	  &lt;fileset dir=&quot;${basedir}/src/main/java/&quot;&gt;
		     &lt;include name=&quot;**/lang/*.properties&quot;&gt;
	 	  &lt;/fileset&gt;
		&lt;/copy&gt;
	    &lt;/tasks&gt;
	   &lt;/configuration&gt;
	   &lt;goals&gt;
	     &lt;goal&gt;run&lt;/goal&gt;
	   &lt;/goals&gt;
	 &lt;/execution&gt;
      &lt;/executions&gt;
     &lt;/plugin&gt;
</pre>
<p>Plugin antrun pozwala wykonać dowolne zadania ant&#8217;a i przypisać je do konkretnego etapu tworzenia oprogramowania. Widzimy tutaj prosty skrypt który wykonuje to czego m2 nie robi.
</p>
<p>
<b>Jesteśmy coraz bliżej</b> działającej dystrybucji <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Do tworzenia dystrybucji używa się wtyczki assembly. Jest ona całkiem przyzwoicie opisana, więc w razie pytań warto <a href="http://maven.apache.org/plugins/maven-assembly-plugin/">tam zajrzeć</a>. Poza tym naprawde dobrze opisał to <a href="http://laskowski.org.pl/">Jacek Laskowski</a>. Mój opis będzie więc zgrubny, ogranicze się tylko do wypisania tego co zmieniłem w stosunku do tego co zaporoponował <a href="http://laskowski.org.pl">Jacek</a>. Oto co zostało dodane do pom.xml:</p>
<pre class="brush: xml;">
       &lt;plugin&gt;
	 &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;
	 &lt;version&gt;2.0.1&lt;/version&gt;
	 &lt;configuration&gt;
	   &lt;descriptors&gt;
  	     &lt;descriptor&gt;src/main/assembly/jar.xml&lt;/descriptor&gt;
	   &lt;/descriptors&gt;
 	   &lt;finalName&gt;${artifactId}&lt;/finalName&gt;
	 &lt;/configuration&gt;
	&lt;/plugin&gt;
</pre>
<p>Jedyną ciekawą rzeczą w tym kawałku xml&#8217;a jest specyfikacja deskryptora. Standardowo deskryptory dla assembly składowane są w src/main/assembly, nasz projekt może być dystrybuowany na więcej niż jeden sposobów. To w jaki sposób każdy z nich będzie tworzony zależy właśnie od opisu. Dokładny opis możliwości i predefiniowanych deskryptorów na stronie pluginu. </p>
<p>
Deskryptor jar.xml musi zostać dodany do projektu w ścieżce która specyfikujemy w pom.xml.</p>
<pre class="brush: xml;">
    &lt;assembly&gt;
        &lt;id&gt;zip&lt;/id&gt;
	&lt;formats&gt;
	 &lt;format&gt;jar&lt;/format&gt;
	&lt;/formats&gt;
	&lt;includeBaseDirectory&gt;false&lt;/includeBaseDirectory&gt;
	&lt;fileSets&gt;
 	  &lt;fileSet&gt;
           &lt;directory&gt;target&lt;/directory&gt;
           &lt;outputDirectory&gt;&lt;/outputDirectory&gt;
            &lt;includes&gt;
             &lt;include&gt;*.jar&lt;/include&gt;
            &lt;/includes&gt;
           &lt;/fileSet&gt;
           &lt;fileSet&gt;
	     &lt;directory&gt;lib&lt;/directory&gt;
             &lt;outputDirectory&gt;&lt;/outputDirectory&gt;
             &lt;includes&gt;
              &lt;include&gt;*.dll&lt;/include&gt;
             &lt;/includes&gt;
           &lt;/fileSet&gt;
        &lt;/fileSets&gt;
       &lt;dependencySets&gt;
         &lt;dependencySet&gt;
           &lt;outputDirectory&gt;/lib&lt;/outputDirectory&gt;
           &lt;unpack&gt;false&lt;/unpack&gt;
           &lt;scope&gt;runtime&lt;/scope&gt;
           &lt;/dependencySet&gt;
         &lt;/dependencySets&gt;
       &lt;/assembly&gt;
</pre>
<p>Tu będzie troche komentarza, określamy format dystrybucji (oprócz zip&#8217;a może być jeszcze chyba tar i jar) tutaj zip. Pierwszy fileset załącza do dystrybucji nasz jar, wygenerowany gdzieś około pierwszego akapitu tego artykułu. Znajdzie sie on w katalogu /target/ i zostanie przekopiowany do głównego katalogu dystrybucji. W <a href="http://weed.xt.pl">Weed</a> używamy kilku dll&#8217;i, który na codzień mieszkają w $project.base.dir/lib zostaną również przekopiowane do katalogu lib. Następnie włączamy do dystrybucji wszystkie zależności, zgodnie z opisaną wcześniej filozofią zostaną one przeniesione do lib. Przy specyfikacji <code>dependencySet</code> ważne jest aby zaznaczyć jaki <code>scope</code> mają mieć zależności włączane do dist&#8217;a  (tutaj np. nie zostanie włączony junit który ma <code>scope</code> test).
</p>
<p>
<b>To właściwie wszystko <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </b>. Prawda jakie to proste <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . teraz <code>mvn assembly:assembly</code> dostaniemy ładnego zip&#8217;a którego po rozpakowaniu możemy uruchomić gdzie nam się spodoba. Drugi wart zapamiętania cel to <code>mvn assembly:directory</code> tworzy on całą strukturę, ale nie pakuje jej do zip&#8217;a. Niezłe do testowania. Uruchamiamy : <code> java -jar test-1.0-SNAPSHOT.jar </code>
</p>
<p>
Problem: niewiem czemu zależności które mają scope : system, nie są uwzględniane w manifeście przy tworzeniu jar&#8217;a. jeżeli ktoś wie dlaczego i jak sobie z tym poradzić będę wdzięczny. <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2006/04/20/m2-tworzenie-wersji-dystrybucyjnej/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven 2.0</title>
		<link>http://grejpfrut.org/blog/2006/03/18/maven-20/</link>
		<comments>http://grejpfrut.org/blog/2006/03/18/maven-20/#comments</comments>
		<pubDate>Sat, 18 Mar 2006 16:55:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://maneo.webd.pl/blog/?p=11</guid>
		<description><![CDATA[
Podobnie jak poprzednio również i ten krótki artykulik będzie pewną syntezą materiałów szkoleniowych. W kilku zdaniach chciałem napisać o tym co w Maven 2 jest takie inne w porównaniu z Maven 1.x. Nie będzie to doglębna analiza, dysponując pewną wiedzą nt. m1.x chciałem stworzyć prosty projekt w m2. Trzeba przyznać, że na stronach Maven&#8217;a znajduje [...]]]></description>
			<content:encoded><![CDATA[<p>
<b>Podobnie jak poprzednio</b> również i ten krótki artykulik będzie pewną syntezą materiałów szkoleniowych. W kilku zdaniach chciałem napisać o tym co w Maven 2 jest takie inne w porównaniu z Maven 1.x. Nie będzie to doglębna analiza, dysponując pewną wiedzą nt. m1.x chciałem stworzyć prosty projekt w m2. Trzeba przyznać, że na stronach Maven&#8217;a znajduje się sporo bardzo dobrych materiałów właściwie nie potrzeba szukać nigdzie indziej wszystko co potrzebne da się tam znaleźć. Bardzo ciekawe artykuły opublikował też na swoim blogu <a href="http://laskowski.org.pl">Jacek Laskowski</a> jeżeli chcesz wiedzieć więcej warto też zajrzeć do niego.
</p>
<ul>
<li><b>Tworzenie szkieletu projektu</b>. W 1.x służyło do tego polecenie <code>maven genapp</code> teraz analogiczne rzeczy robi <code>mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app</code>. Jak widać nie maven tylko mvn <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . W m2 zrezygnowano z Jelly, w związku  z tym wszystkie ciężkie parsery xml&#8217;a i inne cuda potrzebne aby egzekować kod Jelly zostały wycięte. Wszystkie pluginy pisane są Javie i właśnie dlatego parametry dla plugin&#8217;u są podawane w ten a nie w inny sposób (-D&#8230;). (zapraszam do zapoznania się z <a href="http://maven.apache.org/maven1.html">tym</a>) </li>
<li><b>Deskryptor projektu</b> już nie nazywa się <code>project.xml</code> tylko <code>pom.xml</code> zmieniła się też trochę składnia tego pliku. Aby wygenerować deskryptor Eclipse&#8217;y, należy wydać polecenie: <code>mvn eclipse:eclipse</code>. Po imporcie do eclipse konieczne będzie dodanie zmiennej classpath, można to załatwić z linii poleceń:    <code>mvn -Declipse.workspace=[ścieżka-do-przestrzeni-roboczej-Eclipse] eclipse:add-maven-repo</code>.</li>
</ul>
<p>
Teraz kilka drogowskazów:</p>
<ul>
<li>
     <a href="http://maven.apache.org/guides/getting-started/index.html#How%20do%20add%20resources%20to%20my%20JAR?"> dodawanie zasobów do jar&#8217;a </a>
   </li>
<li>
     <a href="http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html">instalowanie jar&#8217;ów w lokalnym repo</a>
   </li>
</ul>
<p>
   Nic co tu opisałem właściwie nie wyszło poza informacje zawarte w <a href="http://maven.apache.org/guides/getting-started/">Getting Started</a>. Polecam też resztę <a href="http://maven.apache.org/guides/">tutoriali</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2006/03/18/maven-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven 1.x &#8211; praktyczne wprowadzenie</title>
		<link>http://grejpfrut.org/blog/2006/03/13/maven-1x-praktyczne-wprowadzenie/</link>
		<comments>http://grejpfrut.org/blog/2006/03/13/maven-1x-praktyczne-wprowadzenie/#comments</comments>
		<pubDate>Mon, 13 Mar 2006 15:07:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://maneo.webd.pl/blog/?p=10</guid>
		<description><![CDATA[ Materiał ten powstał na potrzeby projektu Weed , chciałem to trochę poukładać, dopracować i dlatego publikuje to ponownie jako wpis na blogu. W obecnej sytuacji zaczynanie projektu w oparciu o maven 1.x mija się z celem. Wersja 1.x jest zasadniczo różna od aktualnej gałęzi projektu, ale być może zawarte tu informacje przydadzą się podczas [...]]]></description>
			<content:encoded><![CDATA[<p> Materiał ten powstał na potrzeby projektu <a href="http://weed.xt.pl">Weed</a> , chciałem to trochę poukładać, dopracować i dlatego publikuje to ponownie jako wpis na blogu. W obecnej sytuacji zaczynanie projektu w oparciu o maven 1.x mija się z celem. Wersja 1.x jest zasadniczo różna od aktualnej gałęzi projektu, ale być może zawarte tu informacje przydadzą się podczas grzebania w źródłach z jakiegoś już istniejącego projektu który właśnie z 1.x korzysta. </p>
<p> <b>Zaczynamy, na początek </b>potrzebujemy ściągnąć sobie maven&#8217;a &#8211; <a href="http://maven.apache.org/maven-1.x/start/download.html">stąd</a>. Proces instalacji został opisany dość dobrze na <a href="http://maven.apache.org/maven-1.x/start/install.html">stronie</a>. Nie jest to nic specjalnie wyzudanego <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Po pomyślnym zakończeniu instalacji, czas na stworzenie pierwszego projektu. Wybierz katalog w którym masz prawa do zapisu i uruchom konsolę. Prawdopodobnie trzeba będzie ustawić zmienną PATH, żeby mavena można było wołać zewsząd. Wpisz <code>maven genapp</code>, wynikiem działania tego polecenia będzie szkielet aplikacji. Przykładowa aplikacja zawiera jedną klasę wykonywalną i test dla tej klasy, możemy też przyjrzeć się plikowi project.xml, który jest jądrem każdego projektu mavenowego.</p>
<p> <b>Teraz czas na integracje z Eclipse&#8217;m</b>, projekt który wygenerowaliśmy nie da się zaimportować do naszego ulubionego IDE. Konieczne jest wygenerowanie deskryptorów, oczywiście maven zrobi to za nas <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  w katalogu głównym projektu wywołujemy <code>maven eclipse</code>. Wszystko jest już prawie gotowe do pracy, importujemy projekt do Eclipse&#8217;a (import existing project into workspace&#8230;).</p>
<p> <b>Maven wprowadza bardzo ciekawy</b> sposób zarządzania zależnościami w projektach, najlepiej zilustruje to prosty przykład. Dodamy do naszej aplikacji logowanie. Czym są logger&#8217;y i po co go używać? Wypisywanie komunikatów na standardowe wyjście jest bardzo niefajne, wiedzieli już o tym programiści C (strumienie suxx <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). W poważniejszych zastosowaniach zaleca się stosowanie jakiejś biblioteki logującej np. <a href="http://logging.apache.org/log4j/docs/">log4j</a>.<br />
Otwórz plik project.xml i dopisz następujące linie (po tagu &lt;/developers&gt;)</p>
<pre class="brush: xml;">
 &lt;dependencies&gt;
  &lt;dependency&gt;
   &lt;groupId&gt;log4j&lt;/groupId&gt;
   &lt;artifactId&gt;log4j&lt;/artifactId&gt;
   &lt;version&gt;1.2.13&lt;/version&gt;
  &lt;/dependency&gt;
&lt;/dependencies&gt;
</pre>
<p>Zmieńmy też odrobine App.java, powinien on wyglądać tak:</p>
<pre class="brush: java;">
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

/**
 * Hello world!
 *
 * @author &lt;a href=&quot;http://rose.man.poznan.pl/%7Emaneo/maven/jason@zenplex.com&quot;&gt;Jason van Zyl&lt;/a&gt;
 *
 */
public class App
{

    private static Logger logger = Logger.getLogger(App.class);

    public static void main( String[] args )
    {
        BasicConfigurator.configure();
        logger.info(&quot;hello world&quot;);
    }
}
 </pre>
</p>
<p> Wykonaj teraz polecenie (katalog główny projektu, konsola systemowa:)): <code>maven clean java:compile</code>.Maven sam spróbuje ściągnąć brakującą bibliotekę z zdalnego repozytorium*.</p>
<p> <b>Tak właśnie wygląda pełen cykl</b> dodawania zależności, nie musimy trzymać bibliotek w cvs/svn są one potrzebne tylko na etapie kompilacji (ewentualnie testowania). Oszczędzamy miejsce, wszystkie zależności są wersjonowane, sama struktura opisu w project.xml u pozwala wyspecyfikować skąd- w przypadku braku danej biblioteki w repo ściągnąc, można ją ściągnąc. Maven nie zawsze będzie ściągał deklarowane przez nas jar&#8217;y. Po instalacji na naszym komputerze zostaje stworzone lokalne repozytorium zależności, tam przechowywane są wszystkie zależności. Jeżeli ponownie użyjemy log4j w jakimś innym naszym projekcie maven nie będzie ściągał go ponownie tylko posłuży się tym co ma w lokalnym repo (więcej o repozytoriach <a href="http://maven.apache.org/maven-1.x/using/repositories.html">tutaj</a>). Jedna uwaga o zdalnych repozytoriach, to z jakich będzie korzystał maven, możemy określić za pomocą zmiennej <code>maven.repo.remote</code>  którą ustawiamy w pliku project.properties (lub build.properties) np. <code>maven.repo.remote=http://public.planetmirror.com/pub/maven/,http://www.ibiblio.org/maven/ </code> </p>
<p> <b>Może się zdarzyć</b>, że szukanej przez nas biblioteki/jar&#8217;a nie ma w zdalnym repozytorium które jest domyślnie ustawione w maven. Tak jak pisałem, jeżeli nie nie uda się ściągnąć potrzebnej biblioteki należy zrobić to samemu i ściągniętego jar&#8217;a zainstalować w naszym lokalnym repozytorium zależności. Najprościej będzie to zrobić ręcznie, musimy umieścić jar&#8217;a w odpowiednim katalogu w lokalnym repozytorium. Weźmy naszego log4j&#8217;a w lokalnym repo musimy mieć katalog log4j (taki jak groupId w tagu dependency) w którym musimy mieć katalog jars i tam wrzucamy jar&#8217;a którego nazwa musi być zgodna z wzorem artifactId-version.jar (czyli log4j-1.2.13.jar). Gdzie znaleźć lokalne repo? Domyślnie znajduję się ono w katalogu domowym użytkownika w katalogu <code>.maven/repository</code>). </p>
<p> Po uaktulanieniu opisu projektu (project.xml) wpisz raz jeszcze: <code>maven eclipse</code> aby uaktualnić deskryptory projektu eclipse&#8217;owego.</p>
<p> <b>Maven pozwala tworzyć własne skrypty</b> dzięki którym możemy automatyzować wykonywanie pewnych czynności w projekcie. Skrypty te umieszczmy w pliku <code>maven.xml</code> (w tym samym katalogu gdzie znajduje się <code>project.xml</code>. </p>
<pre class="brush: xml;">
   &lt;project xmlns:maven=&quot;jelly:maven&quot; xmlns:j=&quot;jelly:core&quot;
    xmlns:util=&quot;jelly:util&quot; xmlns:x=&quot;jelly:xml&quot; xmlns:ant=&quot;jelly:ant&quot;&gt;

   &lt;goal name=&quot;mygoal&quot; prereqs=&quot;java:compile&quot;&gt;
       &lt;ant:copy file=&quot;${maven.src.dir}javamyfile.txt&quot; tofile=&quot;${maven.build.dest}myfile.txt&quot;/&gt;
    &lt;/goal&gt;
   &lt;/project&gt;
</pre>
<p> Co to za język? <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <b>Jelly!</b> Osobiście nie jestem jego wielkim fanem, trzeba jednak przyznać, że da się w nim zrobić całkiem sporo. Stwórz plik myfile.txt w katalogu <code>src\java\</code> i wpisz w konsoli : <code>maven mygoal</code>. Sporą część standardowych zadań w projekcie maven załatwia sam z siebie, więc jest spora szansa, że nie będzie potrzeby dotykania Jelly.</p>
<p> <b>Kolejną fajną właściwością</b> m. jest generowanie raportów ze statycznych analiz kodu, maven pozwala generować raporty za pomocą takich narzędzi jak FindBugs, PMD czy Simian. Chcąc skorzystać z raportów, niejako &#8220;przy okazji&#8221; wygenerujemy stronę www dla naszego projektu <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . W project.xml specyfikujemy jakie raporty chcemy wygenerować: (na samym końcu tuż przed tagiem <code>&lt;/project&gt;</code>) </p>
<pre class="brush: xml;">
&lt;reports&gt;
  &lt;report&gt;maven-checkstyle-plugin&lt;/report&gt;
  &lt;report&gt;maven-simian-plugin&lt;/report&gt;
&lt;/reports&gt;
</pre>
<p> <b>Teraz aby  wprowadzić słowa w czyn</b> musimy wpisać w konsoli <code>maven site</code>. W katalogu <code>/target/docs/index.html</code> znajdziemy wyniki działania mavena. Zawartość sekcji <i>Project info</i> i <i>Project reports</i>  możemy wyspecyfikować w pliku <code>project.xml</code>. </p>
<p> I to tyle na początek <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . </p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2006/03/13/maven-1x-praktyczne-wprowadzenie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
