User login

Error message

  • Deprecated function: Function create_function() is deprecated in eval() (line 1 of /var/www/thot-soft.com/web/modules/php/php.module(80) : eval()'d code).
  • Notice: Undefined offset: 1 in nice_menus_block_view() (line 306 of /var/www/thot-soft.com/web/sites/all/modules/nice_menus/nice_menus.module).

Projektkezelés Maven3 rendszerrel - I rész.

A HelloWorld alkalmazásoktól eltekintve kijelenthetjük, hogy minden projektnek szüksége van valamilyen projektkezelő rendszerre. Egyesek megoldják azzal, hogy külön ezzel nem foglalkoznak, a projektkezeléshez elegendő amit a kedvenc Java forráskód szerkesztőjük biztosít (pl. Eclipse, Netbeans, JDeveloper, stb.). Akiknek ez nem elég, beleértve jómagamat is, azok keresnek egy projektkezelő rendszert amellyel egyszerűsíthetik a fejlesztésnek e részét. Ami a Java-t illeti a két legjelentősebb projektkezelő az Apache Ant (http://ant.apache.org/) és az Apache Maven3 (http://maven.apache.org/). Mi a továbbiakban a Maven3-al fogunk foglalkozni. A projektkezeléssel kapcsolatban milyen teendők merülnek fel? Nos, nézzünk egy egyszerű Java alkalmazásnál (nem kell még elmenni a JEE alkalmazások irányában, de hamarosan azt is megnézzük) milyen teendőket kell elvégeznünk a projekt megvalósítása során:

  • Projekt struktúra kialakítása (forráskód elhelyezés, csomagok kialakítása, binárisok elhelyezése, teszt osztályok forráskódjának a helye, stb.)
  • Fordítás és erőforrások kezelése (pl. nyelvi állományok kezelése, konfigurációs xml kezelése, stb.)
  • Tesztelés (pl. Junit tesztek fordítása, futtatása, eredmény értékelés)
  • Telepítés
  • Dokumentálás

Nos, a maven3 minden egyes részhez segítséget tud nyújtani úgy, hogy a programozónak csak a lényegi tartalommal, a kód/dokumentáció megírásával keljen foglalkozzon.

Ami még fontos előnye a maven3-nak (az ant-nak is, természetesen), hogy parancssorból futtatható. Ezáltal távoli szervereken is kiadható a projekt kezelési művelet (fordítás, teszt, telepítés, stb.) anélkül, hogy valamely szerkesztőtől függenénk. És ez az egyik ok amiért igyekszem messze elkerülni a forráskódszerkesztők adta projektkezelési lehetőséget. Ugyanakkor a maven3-al erről sem kell lemondanunk, mivel valamennyi forráskód szerkesztő ismeri a maven3-at és használhatjuk is. No, de térjünk vissza, hogy hogyan is lehet hasznosítani a maven3-at a projektjeinkben. A teljesség kedvéért a telepítéssel kezdjük.

Telepítés

Mielőtt telepítenénk és majd használatba vennénk a maven3-at, győződjünk meg, hogy már korábban telepítettünk egy Java környezetet. Az írásunkban feltételezem, hogy egy 64 bites környezetbe való, Java7 SDK került telepítésre.

A maven3-at a Maven3 letöltési oldalról lehet letölteni. A letöltés után, csomagoljuk ki pl. a c:\apps\maven3 alkönyvtárba. A kicsomagolás után állítsuk be a M2_HOME környezeti változót úgy, hogy a c:\apps\maven3 alkönyvtárra mutasson, továbbá adjuk hozzá a PATH változóhoz a M2_HOME\bin  útvonalat.

A konfigurálást a maven3-nál a settings.xml állományban lehet elvégezni. A maven3 indításkor ellenőrzi, hogy létezik-e a felhasználó 'home' könyvtárában egy .m2 nevezetű alkönyvtár és ezen belül a settings.xml. Ha nincs, akkor ezeket létrehozza. Ez pl. windows7 alatt a  C:\Documents and Settings\<felhasználó_név>\.m2 linux alatt a ~/.m2   könyvtár lesz. Ezekre fontos írás engedélyt adni.

Hogy minden rendben van-e a telepítéssel, ezt a következő egyszerű teszttel ellenőrízhetjük:

Adjuk ki az mvn -version parancsot:

c:\apps>mvn -version
Válaszként a következőt kellene kapni:
 
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 14:51:28+0100)
Maven home: c:\apps\maven3
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: c:\apps\jdk1.7.0_07_x64\jre
Default locale: hu_HU, platform encoding: Cp1250
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

Ahhoz, hogy a .m2 alkönyvtárat létrehozzuk, annak ellenére, hogy még nincsen projektünk, adjuk ki a:

mvn clean 

parancsot:

c:\apps>mvn clean

 
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.164s
[INFO] Finished at: Sat Mar 16 15:24:20 CET 2013
[INFO] Final Memory: 11M/751M
[INFO] ------------------------------------------------------------------------
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (c:\apps). Please verify you invoked Maven from the correct directory. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:

 

Nyilván hibát kapunk, hisz nincs projekt, de ha belenézünk a 'home' könyvtárunkban, látni fogjuk, hogy létrejött a .m2 alkönyvtár és alatta a repository alkönyvtár is.

Ami az alap konfigurációt illeti, egy lényegi beállítást kell még megadni. Nevezetesen azt, hogy hol legyen  az úgynevezett 'repository'. Ez az a hely, ahova majd a maven3 letölti a projekt(ek) során használt jar-okat. Ha nem adjuk meg, akkor az .m2/repository alkönyvtárba fogja letölteni - ami létre is jött ahogy az imént láttuk-, kialakítva egy alkönyvtár struktúrát - ezt majd később részletesebben is megnézzük.  Ha ezen változtatni akarunk, pl. hogy a c:\apps\maven3-repository alá kerüljenek a jar-ok, akkor a settings.xml állományban kell módosítanunk.

Az alapértelmezéseket tartalmazó settings.xml -t megtaláljuk a M2_HOME/conf alkönyvtárban. Fogjuk a settings.xml -t és másoljunk belőle egy példányt a .m2 alkönyvtárban, majd nyissuk meg. Keressük meg a következő kikommentezett részt:

  <!-- localRepository

   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ~/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
Szüntessük meg a kommentet a 

<localRepository>/path/to/local/repo</localRepository>

részre, és írjuk át a következőre:

<localRepository>c:/apps/maven3-repository</localRepository>

Mentsük el az állományt. A .m2 alkönyvtárból törölhetjük is a repository alkönyvtárat, hisz erre már nem lesz szükségünk. A továbbiakban a repository-kánt beállított alkönyvtárra az M2_REPO névvel fogok hivatkozni.

Ezennel a telepítéssel és alapvető konfigurációval végeztünk. Vágjunk bele a projekt kezelésbe!

A Projekt struktúra kialakítása

Nos, maga a projekt legyen viszonylag egyszerű, ugyanakkor elegendően összetett, hogy a bevezetőben felsorolt teendők elvégezhetőek legyenek. Készítsünk el egy osztály könyvtárat (egy jar lesz a végtermék) melyben megvalósításra kerülnek különböző rendezési algoritmusok. A projekt neve legyen "Rendezést Megvalósító Osztálykönyvtár"

A projektstruktúra kialakításához meg kell határoznunk néhány paramétert:

  1. Java csomag megnevezése, amely alatt találhatóak a rendezéseket megvalósító osztályok: com.thotsoft.rendezes
  2. Az előállítandó termék (artifact más néven) megnevezése?: rendezes
  3. A repository-ba milyen csoport (group) alá kerüljön majd a termék (artifact)?: com.thotsoft
  4. Milyen verziószámmal legyen ellátva a termék a fejlesztés alatt?: 1.0-SNAPSHOT
  5. Milyen verziószámmal legyen ellátva a végleges termék?: 1.0-RELEASE

Nos, az induláshoz meg van minden. Ahelyett, hogy projekt struktúrát kézzel hoznánk létre, adjuk ki a következő parancsot a c:\work könyvtárba (ahova létre szeretnénk hozni a projekt könyvtárat):

mvn  archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.1 -DgroupId=com.thotsoft -DartifactId=rendezes -Dpackage=com.thotsoft.rendezes -Dversion=1.0-SNAPSHOT 

Az eredmény a következőhöz hasonló kell, hogy legyen (ne lepődjünk meg, induláskor le fogja tőlteni a szükséges állományokat és ezt meg jeleníti a képernyőn, továbbá félúton meg fog állni - pirossal jelölve lentebb - és kérni fogja a nyugtázást, hogy a megadottaknak megfelelően hozza létre a struktúrát. Egy ENTER-rel nyugtázzuk a kérdést):

[INFO] Scanning for projects...

...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom ---
...
[INFO] Generating project in Interactive mode
[INFO] Archetype repository missing. Using the one from [org.apache.maven.archetypes:maven-archetype-quickstart:1.1] found in catalog remote
[INFO] Using property: groupId = com.thotsoft
[INFO] Using property: artifactId = rendezes
[INFO] Using property: version = 1.0-SNAPSHOT
[INFO] Using property: package = com.thotsoft.rendezes
Confirm properties configuration:
groupId: com.thotsoft
artifactId: rendezes
version: 1.0-SNAPSHOT
package: com.thotsoft.rendezes
 Y: : 
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.thotsoft
[INFO] Parameter: packageName, Value: com.thotsoft.rendezes
[INFO] Parameter: package, Value: com.thotsoft.rendezes
[INFO] Parameter: artifactId, Value: rendezes
[INFO] Parameter: basedir, Value: c:\work
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: c:\work\rendezes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.981s
[INFO] Finished at: Sat Mar 16 17:36:18 CET 2013
[INFO] Final Memory: 13M/751M
[INFO] ------------------------------------------------------------------------
 

Ezáltal létre is jött az első projektünk melynek szerkezete a következő:

rendezes
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- thotsoft
    |               `-- rendezes
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- thotsoft
                    `-- rendezes
                        `-- AppTest.java

Lényeges tudnivalók arról ami létrejött:

  • A pom.xml képviseli a projekt állományt. Minden ami projekttel kapcsolatos itt kell megadni, módosítani.
  • A src/main alkönyvtár alatt kell elhelyezni a forráskódott, ahogy a hiearchiából is látszik
  • A src/test alkönyvtár alatt pedig a tesztelésre szánt forráskódot. A jelen esetben azonos a hiearchia a teszt alatt is. Erről majd később fogunk beszélni.

A könyvtárstruktúra egy javasolt struktúra. Ha ez nekünk megfelel, akkor nagyon gyorsan lehet épitkezni és csakis a lényegre - a feladat megvalósítására - kell koncentrálnunk. Ha ez a könyvtárstruktúra nem felel meg, akkor némi plusz munkával meg lehet mondani a maven3-nak, hogy hol lesz elhelyezve a forráskód, hol a teszt forráskód, hol lesznek az egyéb erőforrások stb. Az elmult évek tapasztalata azt mutatja, hogy a projektek nagy részének ez a struktúra tökéletesen megfelel, így mielőtt nekifognánk átírni az alapértelmezett könyvtár definíciókat, át kellene gondolni, hogy mi lenne, ha mi alkalmazkodnánk a maven3 jól bevált projekt könyvtár struktúrájához. Megéri.

Az első projektünk ezzel létre is jött és máris használható. Az App.java egy egyszerű, HelloWorld jellegű alkalmazást tartalmaz, a AppTest.java pedig az App.java tesztelésére tartalmaz némi példa kódot.

A létrejött projektünket le is tudjuk fordítani és a tesztelés is automatikusan végrehajtódik. Lépjünk a c:\work\rendezes alkönyvtárba, majd adjuk ki a következő parancsot:

 

c:\work\rendezes>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building rendezes 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ rendezes ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory c:\work\rendezes\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ rendezes ---
[INFO] Compiling 1 source file to c:\work\rendezes\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.554s
[INFO] Finished at: Sat Mar 16 20:09:54 CET 2013
[INFO] Final Memory: 17M/751M
[INFO] ------------------------------------------------------------------------
 
Az eredmény, hogy az App.java forráskódot sikeresen lefordította.
A rendezes-1.0-SNAPSHOT.jar-t pedig rögtön elő is tudjuk állítani a következő parancssal:
 
c:\work\rendezes>mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building rendezes 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ rendezes ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory c:\work\rendezes\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ rendezes ---
[INFO] Compiling 1 source file to c:\work\rendezes\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ rendezes ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory c:\work\rendezes\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ rendezes ---
[INFO] Compiling 1 source file to c:\work\rendezes\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.10:test (default-test) @ rendezes ---
[INFO] Surefire report directory: c:\work\rendezes\target\surefire-reports
 
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.thotsoft.rendezes.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 sec
 
Results :
 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
 
[INFO]
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ rendezes ---
[INFO] Building jar: c:\work\rendezes\target\rendezes-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.321s
[INFO] Finished at: Sat Mar 16 20:12:30 CET 2013
[INFO] Final Memory: 15M/751M
[INFO] ------------------------------------------------------------------------
 
Láthatjuk, hogy mielőtt a jar elő áll, a tesztek is futtatásra kerülnek. Milyen egyszerű az egész, nem igaz?
A keletkezett rendezes-1.0-SNAPSHOT.jar-t megtaláljuk a rendezes/target alatti alkönyvtárban, ahol a binárisok, illetve az ideiglenes termékek keletkeznek.
 
Az írásunkat hamarosan folytatjuk a pom.xml rejtelmeivel. Ha a fentiekkel kérdések merülnek fel, kérem keressetek a magyar@mail.thot-soft.com e-mail címen.
 
Hasznos olvasni valók:
 

 

Hungarian

Blog Authors

Blog History