Foto av Johan Eltes

Recept för Maven i Eclipse

// Johan Eltes

Efter att ha provat olika konstellationer av Eclipse-plug:er för Maven, Maven-plug-iner för Eclipse, att bygga från prompten och att bygga i eclipse, har jag fastnat för en uppsättning som jag tycker fungerar riktigt bra.

Min målbild har varit att inte göra några manuella Eclipse-inställningar, utan att dessa ska genereras från Mavens projektfil. På så sätt behöver bara källkod + byggfil vara incheckad i versionshanteringssystemet. Det vore väl kortast möjlig väg från rapporterad bugg till rättad lösning, med utgångspunkt i en “ren” utvecklarmaskin?

  1. Installera Maven, Eclipse, Tomcat (t.ex.) och klienten till versionshanteringssystemet (om annat än CVS eller Subversion)
  2. Checka ut projektet för misstänkt modul
  3. Använd Maven för att generera ett Eclipse-projekt från modulens POM-fil, inklusive inställningar för WTP (för integreration med applikationsserver)
  4. Importera projektet i Eclipse
  5. Jobba helt integrerat i Eclipse (utan att tänka på Maven). Skriv enhetstester för att reproducera buggen, fixa felet, testkör - ev. i WTP
  6. Gör commit och förlita dig på feedback från utvecklingsserverns kontinuerliga byggprocess

Det finns några spelregler man behöver hålla sig till, för att ovanstående ska bli verklighet:

  • Redigera inte Classpath:en i projektets inställningar i Eclipse, utan enbart via beroende-definitionerna i projektets pom-fil.
  • Varje gång beroenden ändrats i pom-filen, behöver maven köras för att generera om Eclipse-projektfiler. Därefter behöver projektet “refreshas”.

Maven-kommandon

Detta arbetssätt kan relativt enkelt fås på plats genom att använda den plug-in för Maven som genererar Eclipse-filer.

Som förberedelse, behöver en classpathvariabel skapas i aktuellt Eclipse-workspace. Variablen ska heta M2_REPO och peka ut lokalt maven repo. Denna variabel kommer sedan att refereras av de genererade eclipse-projekten. Den kan skapas manuellt i Eclipse eller automatiskt med hjälp av följande mavenkommando:

$ mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:configure-workspace

Var noga med att uppdatera eclipse-plugin:en till den senaste versionen efter att du installerat Maven. Argumentet -U gör att den senaste versionen av plugin:en hämtas:

$ mvn -U eclipse:clean

Följande kommando genererar ett komplett eclispe-projekt från POM-filen:

$ mvn -Dwtpversion=1.5 eclipse:eclipse

Detta + refresh i Eclipse, behöver alltså köras efter varje ändring av “dependencies” i pom-filen. Men i övrigt jobbar mani eclipse som vanligt, inklusive full integration för körning av web- och EJB-moduler i WTP:n. WebServices med “contract first” tarvar ett eget kapitel. Det får bli ett senare inlägg!

Att helt slippa prompten

Den kan vara värt en extra inställning för att slippa tänka på att gå ut till prompten när pom:en är ändrad. Det kan enkelt åstakommas genom att i Eclipse projektinställningar lägga till en s.k. “Builder” som kör eclipse-kommandot ovan + refresh så snart POM:en editerats. Följande recept gäller för Eclipse 3.2 och 3.3 och 3.4. I Europa / 3.3 är visserligen WTP-versionen 2.0 respektive 3.0 i Sökresultat

Eclipse 3.4 / Ganymede, men maven-plugin:en känner inte till något högre versionsnummer 1.5 (Callisto / 3.2). Jag har hittills inte stött på några problem med WTP 2.0 eller 3.0 med avseende på WTP-stödet för just web-appar (war).

Builder-dialogen i project properties

Markera Builders och välj New..

Markera Program. Välj sedan OK.

Konfigurera “Buildern”

  1. Namnge konfigurationen
  2. Peka ut sökvägen till Maven-kommandot i fältet Location
  3. Ange Working directory genom att välja Variables och där lägga upp en variabel som pekar på katalogen för multiprojekt-pom:en (oftast en nivå upp ovanför eclipse-projekten). Om du inte har någon multi-projekt-pom, pekar du ut projekt-katalogen genom att istället välja Browse Workspace… och där välja aktuellt projekt (det vars properties du just nu redigerar).
  4. Ange värdet för fältet Arguments till -Dwtpversion=1.5 eclipse:eclipse

Refresh

  1. Välj fliken Refresh.
  2. Kryssa för Refresh resources upon completion
  3. Välj Entire workspace
  4. Markera Recursively include sub-folders.
  5. Avsluta med OK.

Build Options

  1. Gå till fliken Build Options
  2. Markera During auto builds
  3. Markera Specify working set of relevant resources. Genom att sedan klicka på Specify Resources… kan vi styra så att kommandot enbart körs vid ändringar i pom.xml-filer.
  4. I dialogen som kommer upp efter att du tryckt på Specify Resources…, markerar du projektets pom-fil och väljer sedan Finish.
  5. Välj Ok för skapa den nya konfigurationen. Du ska därefter vara tillbaka i dialogen med listan över alla Builders.

Lägg den nya “buildern överst

Innan vi är klara, ska vi se till att vår nya konfiguration, som genererar om classpath-definitioner i eclipse efter ändringar i pom:en, körs före kompileringen. Detta görs genom att markera vår nya “builder” i listan:

Bild saknas

…och därefter trycka upprepade gånger på Up, tills vår “builder” hamnar överst.

Avsluta och testa

  1. Avsluta med att trycka OK i Properties-dialogen för projektet.
  2. Gör sedan en ändring i pom-filen och verifiera att Maven-kommandot automatiskt körs så snart du sparar filen. Utdata från kommandot ska synas i Console-vyn.
  3. Gör en ändring i någon annan fil - t.ex. en Java-klass i projektet, för att verifiera att Maven-kommandot inte triggas av denna ändring.

Kommentarer