Maven Aplikační programování v Javě (BI-APJ) - 2 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Úvod Maven - nástroj pro správu projektů, který obsahuje: objektový model projektu (project object model - POM) reprezetovaný souborem pom.xml, sadu standardů (struktura adresářů, formát pluginů, atd), životní cykly projektu, správu závislostí mezi projekty, logiku provádění cílů pluginů Po instalaci obsahuje Maven pouze malý základní instalační balík. Při práci si stahuje potřebné pluginy ze vzdálených repozitory. Při sestavování projektu Maven aplikuje logiku pluginů a jejich cílů na základě objektového modelu projektu.
Vytvoření projektu Vytváření projektu provádí cíl generate pluginu Archetype volaný v adresáři projektu: $ cd HelloWorld HelloWorld$ mvn generate:archetype Cíl interaktivně vyžádá od uživatele zadání: 1. archetypu (vzoru) projektu - k dispozici je cca 450 různých archetypů. Např.: 135: remote -> maven-archetype-quickstart (An archetype which contains a sample Maven project.) 2. koordináty projektu (groupid,...). Jeden (resp. až všechny) parametry cíle mohou být také zadány přímo při volání: mvn -DgroupId=org.dan -DartifactId=HelloWorld
Struktura projektu Pro zvolený archetyp: (maven-archetype-quickstart) a zvolené koordináty (org.dan, HelloWorld) vytvoří cíl archetype:generate v aktuálním adresáři následující strukturu projektu:
Soubor pom.xml (1/2) Vytvořený projekt obsahuje ve svém projektovém adresáři soubor pom.xml obsahující popis vytvořeného projektu: <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>org.dan</groupid> <artifactid>helloworld</artifactid> <version>1.0-snapshot</version> <packaging>jar</packaging> <name>helloworld</name> <url>http://maven.apache.org</url>
Soubor pom.xml (2/2) <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>
Sestavení projektu Sestavení projektu se provede příkazem: >mvn package package je název jedné fáze životního cyklu. Při sestavování se provedou všechny fáze životního cyklu včetně zadané fáze (tj. včetně package). Po sestavení přibude do kořenového adresáře projektu adresář target:
Protokol sestavení HelloWorld$ mvn package ----------------------------------------------------- [INFO] Building HelloWorld [INFO] Compiling 1 source file to /home/danecek/vyuka /apj/mavenprojects/helloworld/target/classes ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.dan.apptest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] Building jar: /home/danecek/vyuka/apj/mavenprojects/helloworld/target/he lloworld-1.0-snapshot.jar ---------------------------------------------------- [INFO] BUILD SUCCESSFUL
Konvence nad konfiguraci Princip konvence nad konfiguraci (convention over configuration) vznikl jako reakce na vysoce konfigurovatelné, avšak obtížně použitelné systémy (např. JEE 1). Maven definuje řadu imlicitních vlastností projektu: zdrojový kód - ${basedir}/src/main/java resources - ${basedir}/src/main/resources testy - ${basedir}/src/test třídy jsou kompilovány do ${basedir} /target/classes sestavením projektu vznikne jarfile v ${basedir} /target.
Maven souřadnice Maven souřadnice (maven coordinates) jednoznačně projekt určují. Jsou tvořeny atributy: groupid - jednoznačný název organizace (resp. hlavního projektu) např.: org.dan Typicky je tvořen inverzně zapsanou doménou organizace (org.apache.maven). Od groupid se implicitně odvozuje struktura balíků projektu. artefactid - vlastní jméno projektu resp. podprojektu version - implicitně 1.0-SNAPSHOT packaging - typ artefaktu (tj. formátu) projektu, implicitně jar.
Maven Pluginy Funkcionalita Mavenu je tvořena přvážně pluginy, které se stahují podel potřeby ze vzdálených repozitory. Maven plugin (např. archtype) obsahuje jeden nebo více cílů (goal). Např. archetype:generate Typická funcionakita cílů: kompilace zdrojového textu packaging bytecode, publishing sites, any other task which need to happen in a build. generování reportů, deploying na aplikační server Maven dovluje vytvářet zákaznické pluginy mohou být vytvořeny kromě Javy i v jiných jazycích např. i v ANTu
Příklady Pluginů Compiler - obsahuje cíle pro kompilování zdrojových kódů a testů, Surefire - obsahuje cíle pro provádění testů a vytváření reportů. Jar - obsahuje cíle pro vytváření jar artefaktů Hibernate - integruje projekt s často používaným perzistentním frameworkem Hibernate Maven umožňuje vytváření zákaznických pluginů, které moho být psány v různých programovacích jazycích (včetně ANTu).
Plugin Archetype Archetype je Maven plugin sloužící jako generátor projektů na základě vestavěných archetypů. Příklady archetypů (vypíší se při zavolání cíle archetype: generate): 9: jdbc-proc-archetype (Creates simple project with jdbcproc support) 124: geronimo-samples-archetype (Plugin to help create a samples project) 219: quickstart (Archetype for creating a basic Tapestry 5 application.) 281: maven-archetype-nbm (Archetype for Netbeans Modules Maven setup) 287: appframework (Archetype for creating application based on JSR 296) 300: pom-root (Root project archetype for creating multi module projects) 448: spring-osgi-bundle-archetype (Spring OSGi Maven2 Archetype) 449: spring-ws-archetype (Spring Web Services Maven2 Archetype.)
Porovnání Mavenu a ANTu Ant neurčuje žádné konvebce jako je obecná struktura adresářů projektu, implicitní chování atrd. je procedurální is procedural - you have to define goals, goal dependencies and sequence of tasks to each goal. Maven definuje konvence - knows where your source code is because you followed the convention, je deklartativní - you define project model, definuje lifecykle projektu - series of sequential lifecycle phases.
Cíl Cíl (goal) je část pluginu, která může být vykonána samostatně nebo jako součást životního cyklu projektu. Cíl je základní funkční krok Mavenu (obdoba ANT tasku). Příklad: cíl compile pluginu Compiler kompiluje zdrojové kódy projektu. Pluginy/cíle mohou být konfigurovány pomocí elementu configuration: <project>... <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin>
Životní cykly Mavenu Životní cyklus (build lifecycle) je posloupnost fází, která se prochází při sestavování projektu. Fáze jsou záměrně definovány volně, aby mohly mít různý význam pro různé typy projektů Na jednotlivé fáze mohou být namapován jeden nebo i více cílů. Při průchodu životním cyklem provádí Maven postupně namapované cíle namapované k příslušné fázi. Implicitní životní cykly: default (nazývaný také build) - slouží k překladu, otestování a zabalení projektu clean site - slouží k vytvoření dokumentace
Životní cyklus Default Zjednodušené schéma životního cyklu Default:
Repozitory (1/2) Maven repozitory jsou úložište Maven artefaktů. Artefakty jsou v repozitory uloženy v adresářové struktuře, která odpovídá Maven koordinátům. Pro projekt jehož koordináty jsou: artifacid=helloword, groupid=org.dan, version =1.0-SNAPSHOT packging=jar vznikne v repozitory následující struktura:
Repozitory (2/2) Repozitory se dělí na lokální vzdálené (remote) Standardní vzdálená repository je http://repo1.maven.org/maven2/ NetBeans využívají i další vzdálené repository: http://bits.netbeans.org/maven2/ http://download.java.net/maven/2/ Standardní lokální repozitory je v adresáři: USER-HOME/.m2/repository/ Při hledání artefaktu prohledává Maven nejprve lokální a posléze vzdálene repozitory. Artefakty stažené ze vzdálene repozitory překopíruje do lokální. Artefakty aktuálního projektu se do lokální repozitory uloží voláním: mvn install
Závislosti Sekce dependencies v pom.xml umožňuje definovat závislosti mezi různými projekty Příklad: <project>... <dependencies> <dependency> <groupid>group-a</groupid> <artifactid>artifact-a</artifactid> <version>1.0</version> </dependency> </dependencies> </project> Relace závislosti je tranzitivní (artefakt se přebírá závislosti od artefaktu, na kterém je závislý)
Rozsah závislostí Parametrem závislostí je je rozsah závislostí (scope). Ten určuje způsob použití závislostí: compile (implicitní) - závislosti jsou obsaženy v classpath při kompilaci, testování i běhu a jsou tranzitivní. provided - obdobně jako compile, avšak s výjimkou běhu (závislosti se nezabalují do distribučního jarfilu), protože jsou poskytnuty v cílovém prostředí (např. ve webovém kontejeneru). Závislosti nejsou tranzitivní. runtime - závislosti nejsou potřeba pro překlad, ale pouze pro běh (ke třídám se přistupuje pomocí reflexe, např. knihovny JDBC). Jsou obsaženy v classapth za běhu a testování classpaths, avšak nikoliv při kompilaci. test - závislosti jsou v classpath pouze při kompilaci a běhu testů.
Dědění Mechanismus dědění umožňuje dědit obsah z jednoho souboru pom.xml do jiného. Projekt, z jehož POM se dědí, musí být určen pomocí koordinátů v elementu parent: <project>... <parent> <groupid>org.codehaus.mojo</groupid> <artifactid>my-parent</artifactid> <version>2.0</version> <relativepath>../my-parent</relativepath> </parent>... </project> Každý pom také automaticky dědí obsah ze speciálního Super POM. Výsledek dědění se nazývá efektivní POM a lze jej vypsat voláním cíle: mvn help:effectivepom