Maven

Fra TermvaktWiki
(Forskjell mellom revisjoner)
Gå til: navigasjon, søk
m (språkvask)
 
(12 mellomrevisjoner av 2 brukere vises ikke)
Linje 1: Linje 1:
 +
[[Category:Linux]]
 
[[Category:Windows]]
 
[[Category:Windows]]
 
[[Category:Programvare]]
 
[[Category:Programvare]]
 
[[Category:Programmering]]
 
[[Category:Programmering]]
  
 +
Apache Maven er et verktøy for å håndtere programmeringsprosjekter. Maven baserer seg på konseptet project object model, POM,
 +
og kan håndtere [http://en.wikipedia.org/wiki/Software_build byggingen],
 +
rapporteringen og dokumentasjonen til et prosjekt.
  
Apache Maven er et verktøy som kan brukes til å bygge og bruke hvilket som helst Java-basert prosjekt.Det baserer seg på konseptet project object model, POM, og er ment for å lette arbeidet for Java-programmerere.
+
==Maven eksempel==
  
 +
===Opprette et prosjekt===
  
==Hvordan starte maven==
+
Før vi begynner åpner vi en terminal og lager mappen "mvntest" på
 +
[[Hjemmeområde|hjemmeområdet]]:
  
I kommandovinduet, skriver du følgende Maven mål:
+
      kabeern@bubo ~ $ mkdir mvntest
 +
      kabeern@bubo ~ $ cd mvntest
 +
      ./mvntest
 +
      kabeern@bubo ~/mvntest $
  
      mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
+
For å opprette et nytt Mavenprosjekt så kan du taste inn følgende i
 +
terminalen:
  
Dett kan ta litt tid hvis du nettopp har installert programvaren, nye plugins og oppdateringer vil bli hentet. Har du problemer kan du gjenta kommandoen noen ganger, det kan være pga time out grunnet lang tid på nedlstninger.
+
      mvn archetype:create -DgroupId=no.uio.app -DartifactId=halloSmurf
  
Målet lagde et mappe (directory) med det samme navnet som artifactId. Gå til denne mappen:
+
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.
  
      cd my-app
+
Når du kjører kommandoen så burde du forhåpentligvis få noe lignende:
  
I denne mappen vil du finn denne standard prosjekt strukturen
+
      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 $
  
    my-app
+
Dette kan ta litt tid hvis du nettopp har installert Maven eller hvis
    |-- pom.xml
+
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.
    `-- src
+
        |-- main
+
        |  `-- java
+
        |      `-- com
+
        |          `-- mycompany
+
        |              `-- app
+
        |                  `-- App.java
+
        `-- test
+
            `-- java
+
                `-- com
+
                    `-- mycompany
+
                        `-- app
+
                            `-- AppTest.java
+
  
Du finner prosjekt kildekoden under src/main/java, testkilden under src/test/java, og pom.xml er prosjektets Project Object Model, eller POM.
+
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:
  
==POM==
+
      kabeern@bubo ~/mvntest $ cd halloSmurf
 +
      ./halloSmurf
 +
      kabeern@bubo ~/mvntest/halloSmurf $
  
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 mye intrikate detaljer. I startfasen trenger du ikke alle disse detaljene. Dette er et eksempel på et prosjekts POM:
+
og taster inn "tree" i terminalen så burde du få denne mappestrukturen for  
 +
prosjektet:
  
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
       kabeern@bubo ~/mvntest/halloSmurf $ tree
       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>
+
       |-- pom.xml
       <groupId>com.mycompany.app</groupId>
+
       `-- src
       <artifactId>my-app</artifactId>
+
          |-- main
      <packaging>jar</packaging>
+
          |  `-- java
      <version>1.0-SNAPSHOT</version>
+
          |       `-- no
       <name>Maven Quick Start Archetype</name>
+
           |          `-- uio
      <url>http://maven.apache.org</url>
+
           |              `-- app
      <dependencies>
+
           |                  `-- App.java
        <dependency>
+
           `-- test
           <groupId>junit</groupId>
+
              `-- java
           <artifactId>junit</artifactId>
+
                  `-- no
           <version>3.8.1</version>
+
                      `-- uio
           <scope>test</scope>
+
                          `-- app
        </dependency>
+
                              `-- AppTest.java
       </dependencies>
+
        
    </project>
+
      11 directories, 3 files
 +
      kabeern@bubo ~/mvntest/halloSmurf $
  
Nå kjørte (execute) du Maven målet (goal) archetype:create, og et sett parametere ble sendt med. Prefixen archetype er pluginen som inneholder målet (goal). Dette målet konstruerte et enkelt prosjekt basert på en archetype. Plugin er en samling av mål (goals) med et generelt felles formål. For eksempel har jboss-maven-plugin formålet å "håndtere forskjellige jboss items".
 
  
==Bygge opp et prosjekt==
+
Du finner kildekode for prosjektet under src/main/java, testkode under
 +
src/test/java, og pom.xml, prosjektets POM (Project Object Model) i rotmappen.
  
  mvn package
+
====POM====
  
Da vil det skrives ut forskjellige handlinger og slutte med:
+
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"
  [INFO] ------------------------------------------------------------------------
+
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  [INFO] BUILD SUCCESSFUL
+
        <modelVersion>4.0.0</modelVersion>
  [INFO] ------------------------------------------------------------------------
+
     
  [INFO] Total time: 2 seconds
+
        <groupId>no.uio.app</groupId>
  [INFO] Finished at: Thu Oct 05 21:16:04 CDT 2006
+
        <artifactId>halloSmurf</artifactId>
  [INFO] Final Memory: 3M/6M
+
        <version>1.0-SNAPSHOT</version>
  [INFO] ------------------------------------------------------------------------
+
        <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>
  
I motsetning til den første komandoen (archetype:create) er den andre kommandoen bare t enkelt ord - package. I stedet for et mål (goal), er dette en fase (phase). Dette er et steg i byggesyklusen (build lifecycle), som er en ordnet sekvens av faser (phases). Når en fase (phase) er gitt, vil Maven kjøre alle faser i sekvensen frem til og med den som ble gitt. For eksempel, hvis du angir kompileringsfasen, vil disse fasene bli kjørt:
+
===Bygge et prosjekt===
  
  1. validate
+
Hvis vi ennå befinner oss i rotmappen ("halloSmurf") for det nyopprettede prosjektet så bygger vi vårt lille program ved å kjøre "mvn package"
  2. generate-sources
+
  3. process-sources
+
  4. generate-resources
+
  5. process-resources
+
  6. compile
+
  
You may test the newly compiled and packaged JAR with the following command:
+
      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 $
  
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
+
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.
  
Which will print the quintessential:
+
===Kjøre et prosjekt===
  
Hello World!
+
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.
  
Running Maven Tools
+
      kabeern@bubo ~/mvntest/halloSmurf $ java -cp target/halloSmurf-1.0-SNAPSHOT.jar  no.uio.app.App
Maven Phases
+
      Hello World!
 +
      kabeern@bubo ~/mvntest/halloSmurf $
  
Although hardly a comprehensive list, these are the most common default lifecycle phases executed.
+
===Bonus===
  
    * validate: validate the project is correct and all necessary information is available
+
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
    * compile: compile the source code of the project
+
    * test: test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
+
    * package: take the compiled code and package it in its distributable format, such as a JAR.
+
    * integration-test: process and deploy the package if necessary into an environment where integration tests can be run
+
    * verify: run any checks to verify the package is valid and meets quality criteria
+
    * install: install the package into the local repository, for use as a dependency in other projects locally
+
    * deploy: done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
+
  
There are two other Maven lifecycles of note beyond the default list above. They are
+
      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!" );
 +
          }
 +
      }
  
    * clean: cleans up artifacts created by prior builds
+
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.
  
    * site: generates site documentation for this project
+
      ...
 +
      [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 $
  
Phases are actually mapped to underlying goals. The specific goals executed per phase is dependant upon the packaging type of the project. For example, package executes jar:jar if the project type is a JAR, and war:war is the project type is - you guessed it - a WAR.
+
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.
  
An interesting thing to note is that phases and goals may be executed in sequence.
+
      <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>
  
mvn clean dependency:copy-dependencies package
+
kjører "mvn package" og "java -jar target/halloSmurf-1.0-SNAPSHOT.jar"
  
This command will clean the project, copy dependencies, and package the project (executing all phases up to package, of course).
+
      kabeern@bubo ~/mvntest/halloSmurf $ mvn package
Generating the Site
+
      ...
 +
      [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 $
  
mvn site
+
og det var det!
  
This phase generates a site based upon information on the project's pom. You can look at the documentation generated under target/site.
+
== Eksterne lenker ==
  
 
+
* [http://maven.apache.org/ Apache Maven hovedside]
==Versjon==
+
* [http://www.sonatype.com/books/mvnex-book/reference/public-book.html Mavenbok på nettet med masse eksempler]
For å sjekke hvilken versjon du har installert kan du bruke denne kommandoen:
+
* [http://www.uio.no/studier/emner/matnat/ifi/INF5750/ UiO kursside for INF5750 - Open Source Software development]
 
+
    mvn --version
+
 
+
 
+
Og detaljene vil listes opp
+
 
+
    Maven version: 2.0.8
+
    Java version: 1.5.0_12
+
    OS name: "windows 2003" version: "5.2" arch: "x86" Family: "windows"
+
 
+
 
+
For mer informasjon og hjelp, sjekk http://apache.maven.org/
+

Nåværende revisjon fra 23. des 2011 kl. 10:29


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