Dość długo nic nie pisałem, szczerze mówiąc zastanawiałem się, czy nie przestać całkowicie (jak się okazuje, strasznie trudno pisać o tym, co możnaby w tym czasie robić ;) ), ale postanowiłem coś jednak naskrobać i dalej prowadzić ten swój zapiśnik. Nie będę chyba jednak publikował wpisów zbyt często, bo postanowiłem już całkowicie sprowadzić tego bloga do roli swego rodzaju notatnika zawierającego po prostu rzeczy do zapamiętania.

Dziś o pewnym narzędziu, z którym życie programisty Java staje się łatwiejsze – Ant.

Ant to – jak pewnie każdy Javowiec wie – doskonałe narzędzie upraszczające nie tylko proces budowania projektów, ale pomagające zautomatyzować każdą rutynową operację. Wachlarz instrukcji, które potrafi on wykonać jest ogromny i stale się powiększa.

Ostatnio miałem okazję budować projekt, który zależał od kilku innych podprojektów, których z kolei wynikami były różne typy archiwów (JAR/WAR). Całość (projekt główny) była pakietem EAR zawierającym wspomniane wcześniej archiwa. Z poziomu mojego ulubionego Eclipse można oczywiście wyklikać eksport owych składników do projektu docelowego, ale wykonywanie tego przy każdej próbie sprawdzenia efektów swojej pracy było dość uciążliwe. Na szczęście Eclipse jest doskonale zintegrowany z Antem, toteż przygotowanie pliku budującego dla moich projektów trwało dosłownie chwilę. Ant dysponuje również instrukcją ‚ant’ pozwalającą na wykonanie innego pliku budującego z poziomu pliku głównego. To idealne rozwiązanie dla mojej sytuacji z podprojektami.

<property name="ejbjar.dir" value="${basedir}/../MyEJBModule"/>
<property name="webmodule.dir" value="${basedir}/../MyWEBModule"/>        
<target name="preparecomponents">
  <ant antfile="build.xml" dir="${ejbjar.dir}"/>
  <ant antfile="build.xml" dir="${webmodule.dir}"/>
</target>

Pojawił się jednak pewien problem, otóż tak wykonywane skrypty Ant’a posiadały dość dziwne własności (properties). Okazało się, że dziedziczą one po projekcie głównym i tak najczęściej używane przeze mnie własności jak np. project.distname, czy basedir miały wartości zdefiniowane w projekcie głównym, a nie te, których definicja występowała u nich samych, co oczywiście powodowało błędy przy budowaniu i ogólną porażkę. Rozwiązaniem może tu być zmiana nazw własności na unikalne dla każdego z projektów, ale to oczywiście nie jest najelegantsze rozwiązanie, pomijając już jego sensowność.

Na szczęście Ant zabezpiecza nas przed tym dodając atrybut inheritall, pozwalający na zbudowanie zupełnie nowego środowiska dla każdego poszczególnego skryptu wykonywanego z poziomu skryptu głównego.

<target name="preparecomponents">
  <ant antfile="build.xml" dir="${ejbjar.dir}" inheritall="false"/>
  <ant antfile="build.xml" dir="${webmodule.dir}" inheritall="false"/>
</target>

W ten sposób każdy z komponentów zostanie zbudowany tak, jakbyśmy wykonali osobno każdy ze skryptów budowania. Warto zanotować, że w elemencie ant można zagnieżdżać elementy property i przekazywać je do wykonywanego skryptu, zatem komunikacja skryptu głównego z komponentami jest również możliwa.