I takt med att mjukvaran blivit mer komplex har behovet av standardiserade och dynamiska byggssystem blivit allt större. Min ringa erfarenhet av byggare strÀcker sig till Make, Ant och nu senast Maven.
Make var svÄrt att undvika nÀr man vÀl kom in i UnixvÀrlden, som ofta Àr synonymt med universitetsvÀrlden. Genom Ären har man hört ett och annat okvÀdningsord om Make, men personligen förstÄr jag inte riktigt varför, speciellt inte efter ha mött Ant.
Det stora problemet med Ant Àr att man har tagit ett sk. uppmÀrkningssprÄk (mark-up language) som i bÀsta fall kan klassas som deklarativt och sedan försökt införa kontrollflöde ovan pÄ det. Dessutom fÄr jag en kÀnsla av att hela sprÄket genomsyras av bristande kunskap om hur man designar sprÄk, ett problem som i sig rÀknas som ett eget vetenskapligt omrÄde inom datavetenskapen.
(Ants sprÄkliga design fÄr mig att tÀnka pÄ sprÄket RPG fritt format, dÀr varje sats mÄste avslutas med semikolon. Man kan ana hur sprÄkdesignerna bör ha influerats av samtida sprÄk som C och Pascal. Det intressanta Àr dock att till skillnad frÄn RPG sÄ fyller semikolonet en funktion i bÄda dessa sprÄk eftersom man kan ha flera satser per rad. I RPG Àr detta inte tillÄtet: hÀr gÀller en sats, en rad. DÀrför blir semikolonet helt onödigt. )
Det var dÀrför med blandade kÀnslor jag började anvÀnda Maven i mitt nuvarande projekt. I likhet med Ant sÄ skriver man i Maven ocksÄ sina byggfiler i XML. I stÀllet för build.xml kallas de för pom.xml. HÀr slutar dock likheterna. Ant ger dig inget mer, du mÄste sjÀlv bestÀmma projektstruktur och hela faderullan. Det slutar oftast i ett gytter av intrikata beroende mellan inkluderade byggfiler och luddiga targets.
Maven har istĂ€llet standardiserat hur byggena ska genomföras. Naturligtvis gĂ„r det att anpassa mot t.ex. gamla Antbyggen om man vill, men det blir knöligt. Mitt tips Ă€r att följa Mavenkonventionen sĂ„ lĂ„ngt det Ă€r möjligt. Ett bygge genomgĂ„r ett antal faser som Ă€r beroende av varandra. Skriver man t.ex. âmvn packageâ för att skapa byggets artifakt sĂ„ genomförs alla tidigare faser som t.ex. compile och test.
Maven har direkt stöd för nÀstlade moduler (projekt) som i t.ex. Netbeans. TyvÀrr har inte alla verktyg detta (t.ex. Eclipse). DÀrför bör man för största IDE-kompatibilitet försöka köra en platt struktur. Varje modul har en sk. pom.xml-fil (Project Object Model). I denna specificeras t.ex. vad modulen heter, vilken version den har, vad den producerar för artifakt, om modulen Àr beroende av andra moduler (interna som externa).
Varje modul producerar högst en artifakt . I Maven finns inbyggt stöd för de vanligaste artifakterna (WAR, EJB, JAR etc) i form av pluggar som laddas ner automatiskt nÀr de refereras. Pluggarna hjÀlper till att skapa artifakten genom att bl.a. generera deskriptorer och inkludera beroenden. Det enda man behöver tÀnka pÄ Àr att följa Mavens katalogstruktur, men Àven detta fÄr man hjÀlp med.
Varje plugg kan konfigureras för exakt bestÀmma hur genererad artifakt ska se ut. Exempelvis bestÀmmer man i maven-ear-plugin vilken kontextrot man vill ha, om man inte nöjer sig med default. Maven ser till att generara nödvÀndig information i application.xml för detta.
För varje beroende (t.ex. Hibernate, Log4J etc) man har i sin modul sÄ specificerar man dessa genom namn, version och scope. T.ex. Hibernate, version 3.23 och scope test innebÀr att Maven lÀgger Hibernate version 3.23 till classpath vid körning av enhetstester. RÀtt beroende tankas automatiskt hem frÄn ett centralt Mavenarkiv. PÄ det hÀr sÀttet fÄr man en bra versionshantering av sina beroenden. Alla i projektet kommer att utveckla mot samma version.
Vilka arkiv som ska anvÀndas kan man styra. Man kan sÀtta upp egna speglar och proxies mot det centrala arkivet eller egna företags-arkiv. Varje anvÀndare har dessutom ett lokalt arkiv i sin hemkatalog dÀr alla beroende cacheas. Utveckling kan alltsÄ ske offline.
Det Àr att rekommendera att man som företag sÀtter upp en proxy mot det centrala Maven arkivet. NÀr beroenden tankas hem frÄn det centrala arkivet kommer de automatiskt att lagras pÄ proxyn. PÄ sÄ sÀtt sÀkerstÀlls att företaget har direkt tillgÄng till alla refererade beroenden. Notera att beroenden normalt Àr transitiva, t.ex. Hibernate beror i sin tur pÄ Log4J. Som tur Àr behöver du inte bry dig om det, utan Maven sköter det Ät dig genom att automatiskt tanka hem transitiva beroenden.
Maven hjĂ€lper dig inte bara med att kompilera ditt projekt, köra tester och generera dokumentation, utan du kan ocksĂ„ fĂ„ hjĂ€lp med att driftsĂ€tta. Pluggen cargo-maven2-plugin kan t.ex. fjĂ€rrdriftsĂ€tta mot en JBoss-server nĂ€r man skriver âmvn installâ. Vill man sĂ„ kan fĂ„ Maven (genom cargo-maven2-plugin) att tanka hem, zippa upp och start en JBoss om den inte redan finns.
Vad blir slutsatsen dÄ? Det lÄter ju som Maven Àr ett helt underbart byggverktyg. Och det Àr det oftast. Mavens absolut största nackdel Àr att det Àr sÄ **** odokumenterat. Maven Àr en enda stor samling insticksprogram som var och en Àr separat dokumenterade. De mindre ÀnvÀnda insticken Àr mycket sparsamt dokumenterade. Det finns vÀldigt fÄ centrala kÀllor att gÄ till, utan mycket ligger utspritt pÄ webben. I början kÀnns Mavenrymden vÀldigt kaotisk.
NÀr jag sÀger Maven sÄ menar jag dessutom Maven 2. PÄ nÀtet finns en del information om Maven, men i bland avser den Maven 1. De tvÄ versionerna skiljer sig relativt mycket. I början kan det vara lite förvillande.
RÀkna ocksÄ med en del buggar vad det gÀller de mindre frekvent anvÀnda funktionerna. Bara i dag har jag sprungit pÄ tvÄ stycken: den ena som har med arv av profiler att göra verkar det Ànnu inte finnas nÄn fix för och den andra som har med filterhantering i maven-assembly-plugin att göra fanns det en fix i version 2.2-beta-2-SNAPSHOT av pluginnen. För att avhjÀlpa det senare problemet behövde jag bara specificera rÀtt version i pommen.
TyvÀrr sÄ kÀnns det inte helt stabilt att förlita affÀrskritisk verksamhet pÄ en snapshot. NÀsta dag kan en ny bugg som fallerar bygget vara introducerad i snapshoten. Visst, i de lÀgena gÄr det faktiskt att specificera en specifik snapshot, t.ex. 2.2-beta-2-20070808.014358-13.
Hur som helst. Maven Àr trots nackdelarna ett sÄ stort steg i rÀtt riktning att jag inte skulle tveka att anvÀnda det i nÀsta projekt. Men om du eller ditt företag ska gÄ över till Maven rÀkna med en tuff startstrÀcka. Jag rekommenderar ha en Maven-expert nÀra till hands.