Maven

Fra TermvaktWiki
Gå til: navigasjon, søk


Apache Maven er et verktøy for å håndtere programmeringsprosjekter. Maven baserer seg på konseptet project object model, POM, og kan håndtere byggingen, rapporteringen og dokumentasjonen til et prosjekt.

Innhold

Maven eksempel

Opprette et prosjekt

Før vi begynner åpner vi en terminal og lager mappen "mvntest" på hjemmeområdet:

     kabeern@bubo ~ $ mkdir mvntest 
     kabeern@bubo ~ $ cd mvntest 
     ./mvntest
     kabeern@bubo ~/mvntest $

For å opprette et nytt Mavenprosjekt så kan du taste inn følgende i terminalen:

     mvn archetype:create -DgroupId=no.uio.app -DartifactId=halloSmurf

I dette eksemplet så spiller ikke groupId noen stor rolle, men ved større prosjekter hvor flere prosjekter og moduler er involvert så er det anbefalt å velge noe mer fornuftig.

Når du kjører kommandoen så burde du forhåpentligvis få noe lignende:

     kabeern@bubo ~/mvntest $ mvn archetype:create -DgroupId=no.uio.app -DartifactId=halloSmurf 
     Info: using java from store (/local/opt/j2sdk).
     [INFO] Scanning for projects...
     [INFO] Searching repository for plugin with prefix: 'archetype'.
     [INFO] ------------------------------------------------------------------------
     [INFO] Building Maven Default Project
     [INFO]    task-segment: [archetype:create] (aggregator-style)
     [INFO] ------------------------------------------------------------------------
     [INFO] [archetype:create]
     [WARNING] This goal is deprecated. Please use mvn archetype:generate instead
     [INFO] Defaulting package to group ID: no.uio.app
     [INFO] artifact org.apache.maven.archetypes:maven-archetype-quickstart: checking for updates from central
     [INFO] ----------------------------------------------------------------------------
     [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-      quickstart:RELEASE
     [INFO] ----------------------------------------------------------------------------
     [INFO] Parameter: groupId, Value: no.uio.app
     [INFO] Parameter: packageName, Value: no.uio.app
     [INFO] Parameter: package, Value: no.uio.app
     [INFO] Parameter: artifactId, Value: halloSmurf
     [INFO] Parameter: basedir, Value: /uio/aristoteles/s14/kabeern/mvntest
     [INFO] Parameter: version, Value: 1.0-SNAPSHOT
     [INFO] project created from Old (1.x) Archetype in dir: /uio/aristoteles/s14/kabeern/mvntest/halloSmurf
     [INFO] ------------------------------------------------------------------------
     [INFO] BUILD SUCCESSFUL
     [INFO] ------------------------------------------------------------------------
     [INFO] Total time: 4 seconds
     [INFO] Finished at: Thu Oct 13 20:30:21 CEST 2011
     [INFO] Final Memory: 16M/352M
     [INFO] ------------------------------------------------------------------------
     kabeern@bubo ~/mvntest $ 

Dette kan ta litt tid hvis du nettopp har installert Maven eller hvis du kjører det for første gang, siden det laster ned programvare og sjekker for oppdateringer. Får du problemer så kan du gjenta kommandoen noen ganger, f. eks. så kan du pga dårlig internettforbindelse få tidsavbrudd mens Maven laster ned.

Nå burde du ha en mappe med det samme navnet som artifactId, som i vårt eksempel er "halloSmurf". Hvis vi skifter til denne mappen:

     kabeern@bubo ~/mvntest $ cd halloSmurf 
     ./halloSmurf
     kabeern@bubo ~/mvntest/halloSmurf $ 

og taster inn "tree" i terminalen så burde du få denne mappestrukturen for prosjektet:

     kabeern@bubo ~/mvntest/halloSmurf $ tree
     .
     |-- pom.xml
     `-- src
         |-- main
         |   `-- java
         |       `-- no
         |           `-- uio
         |               `-- app
         |                   `-- App.java
         `-- test
             `-- java
                 `-- no
                     `-- uio
                         `-- app
                             `-- AppTest.java
     
     11 directories, 3 files
     kabeern@bubo ~/mvntest/halloSmurf $ 


Du finner kildekode for prosjektet under src/main/java, testkode under src/test/java, og pom.xml, prosjektets POM (Project Object Model) i rotmappen.

POM

Filen pom.xml er kjernen til et prosjekts konfigurasjon i Maven. Denne ene fila inneholder størsteparten av informasjonen som kreves for å bygge et prosjekt slik du ønsker. Fila er stor og kan inneholder mange intrikate detaljer, men i startfasen så trenger du ikke å forandre den. POM-filen til det autogenererte prosjektet vårt ser slik ut:

     <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
     
       <groupId>no.uio.app</groupId>
       <artifactId>halloSmurf</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>jar</packaging>
     
       <name>halloSmurf</name>
       <url>http://maven.apache.org</url>
     
       <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       </properties>
     
       <dependencies>
         <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>3.8.1</version>
           <scope>test</scope>
         </dependency>
       </dependencies>
     </project>

Bygge et prosjekt

Hvis vi ennå befinner oss i rotmappen ("halloSmurf") for det nyopprettede prosjektet så bygger vi vårt lille program ved å kjøre "mvn package"

     kabeern@bubo ~/mvntest/halloSmurf $ mvn package
     Info: using java from store (/local/opt/j2sdk).
     [INFO] Scanning for projects...
     [INFO] ------------------------------------------------------------------------
     [INFO] Building halloSmurf
     [INFO]    task-segment: [package]
     [INFO] ------------------------------------------------------------------------
     [INFO] [resources:resources]
     [INFO] Using default encoding to copy filtered resources.
     [INFO] [compiler:compile]
     [INFO] Compiling 1 source file to /uio/aristoteles/s14/kabeern/mvntest/halloSmurf/target/classes
     [INFO] [resources:testResources]
     [INFO] Using default encoding to copy filtered resources.
     [INFO] [compiler:testCompile]
     [INFO] Compiling 1 source file to /uio/aristoteles/s14/kabeern/mvntest/halloSmurf/target/test-classes
     [INFO] [surefire:test]
     [INFO] Surefire report directory: /uio/aristoteles/s14/kabeern/mvntest/halloSmurf/target/surefire-reports
     
     -------------------------------------------------------
      T E S T S
     -------------------------------------------------------
     Running no.uio.app.AppTest
     Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.042 sec
     
     Results :
     
     Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
     
     [INFO] [jar:jar]
     [INFO] Building jar: /uio/aristoteles/s14/kabeern/mvntest/halloSmurf/target/halloSmurf-1.0-SNAPSHOT.jar
     [INFO] ------------------------------------------------------------------------
     [INFO] BUILD SUCCESSFUL
     [INFO] ------------------------------------------------------------------------
     [INFO] Total time: 4 seconds
     [INFO] Finished at: Thu Oct 13 18:06:29 CEST 2011
     [INFO] Final Memory: 16M/240M
     [INFO] ------------------------------------------------------------------------
     kabeern@bubo ~/mvntest/halloSmurf $ 

Hvis prosjektet kompilerer riktig og alle testene kjører uten feil så vil Maven pakke prosjektet ned i en JAR-fil i mappen "target" og skrive ut "BUILD SUCCESSFUL" til terminalen.

Kjøre et prosjekt

Hvis alt har gått bra hittil, dvs. oppretting og bygging av prosjektet har gått riktig for seg så vil kjøringen av JAR-filen skrive ut "Hello World!" til terminalen. Merk at vi gir beskjed om at det er main-metoden i App.java som skal kjøres ved å legge til "no.uio.app.App" som argument til java-kommandoen.

     kabeern@bubo ~/mvntest/halloSmurf $ java -cp target/halloSmurf-1.0-SNAPSHOT.jar  no.uio.app.App
     Hello World!
     kabeern@bubo ~/mvntest/halloSmurf $ 

Bonus

Vi vil ha mer, en enkel "Hello World!" utskrift er ikke nok til vårt halloSmurf prosjekt. Vi utvider App.java med et par flere utskrifter

     package no.uio.app;
     
     /**
      * Hello world!
      *
      */
     public class App 
     {
         public static void main( String[] args )
         {
             System.out.println( "Hello World!" );
             System.out.println( "Hallo Bestefarsmurf!" );
             System.out.println( "Hallo Smurfine!" );
             System.out.println( "Hallo Brillesmurf!" );
             System.out.println( "Smurf!Smurf!Smurf!Smurf!Smurf!" );
         }
     }

Hvis vi kjører "mvn package" og "java -cp target/halloSmurf-1.0-SNAPSHOT.jar no.uio.app.App" så burde vi få en lignende utskrift i terminalen.

     ...
     [INFO] [jar:jar]
     [INFO] Building jar: /uio/aristoteles/s14/kabeern/mvntest/halloSmurf/target/halloSmurf-1.0-SNAPSHOT.jar
     [INFO] ------------------------------------------------------------------------
     [INFO] BUILD SUCCESSFUL
     [INFO] ------------------------------------------------------------------------
     [INFO] Total time: 2 seconds
     [INFO] Finished at: Sun Oct 16 13:18:06 CEST 2011
     [INFO] Final Memory: 14M/334M
     [INFO] ------------------------------------------------------------------------
     kabeern@bubo ~/mvntest/halloSmurf $ java -cp target/halloSmurf-1.0-SNAPSHOT.jar  no.uio.app.App
     Hello World!
     Hallo Bestefarsmurf!
     Hallo Smurfine!
     Hallo Brillesmurf!
     Smurf!Smurf!Smurf!Smurf!Smurf!
     kabeern@bubo ~/mvntest/halloSmurf $ 

Til sist så vil vi gi Maven beskjed om å bygge prosjektet slik at vi slipper å taste "no.uio.app.App" hvert eneste gang vi vil kjøre JAR-filen. Dette gjør vi ved å redigere POM-filen til prosjektet.

     <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
     
       <groupId>no.uio.app</groupId>
       <artifactId>halloSmurf</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>jar</packaging>
     
       <name>halloSmurf</name>
       <url>http://maven.apache.org</url>
     
       <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       </properties>
     
       <dependencies>
         <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>3.8.1</version>
           <scope>test</scope>
         </dependency>
       </dependencies>
       
       <build>
         <plugins>
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-jar-plugin</artifactId>
             <configuration>
               <archive>
                 <manifest>
                   <mainClass>
                     no.uio.app.App
                   </mainClass>
                 </manifest>
               </archive>
             </configuration>
           </plugin>
         </plugins>
       </build>
     </project>

kjører "mvn package" og "java -jar target/halloSmurf-1.0-SNAPSHOT.jar"

     kabeern@bubo ~/mvntest/halloSmurf $ mvn package
     ...
     [INFO] [jar:jar]
     [INFO] Building jar: /uio/aristoteles/s14/kabeern/mvntest/halloSmurf/target/halloSmurf-1.0-SNAPSHOT.jar
     [INFO] ------------------------------------------------------------------------
     [INFO] BUILD SUCCESSFUL
     [INFO] ------------------------------------------------------------------------
     [INFO] Total time: 2 seconds
     [INFO] Finished at: Sun Oct 16 13:56:54 CEST 2011
     [INFO] Final Memory: 12M/332M
     [INFO] ------------------------------------------------------------------------
     kabeern@bubo ~/mvntest/halloSmurf $ java -jar target/halloSmurf-1.0-SNAPSHOT.jar
     Hello World!
     Hallo Bestefarsmurf!
     Hallo Smurfine!
     Hallo Brillesmurf!
     Smurf!Smurf!Smurf!Smurf!Smurf!
     kabeern@bubo ~/mvntest/halloSmurf $ 

og det var det!

Eksterne lenker

Personlige verktøy
Navnerom
Varianter
Handlinger
Navigasjon
Kategorier
Programvare
Andre
Translate
Verktøy