Stefan Scheidt, Senior ArchitektOPITZ CONSULTING Gummersbach GmbHAutomatischer Build mit Maven
Wer ist OPITZ CONSULTING?Last Minute:Offizieller OC 1 SeiterVon TomIhr Projektspezialist für Java, SOA und Oracle
Wer bin ich?Software-Entwickler und ArchitektTrainer und CoachSprecher und Autor
(Keine) MotivationIn diesem Vortrag keine Motivation für Build-AutomatisierungAber ein paar Ziele:Automatisiertes TestenContinuous IntegrationCode-Qualität
Was ist Maven?„Software Project Management Tool“DeklarativesBuild-SystemConvention overConfigurationWiederverwendung durch PluginsDependency ManagementTool für technisches Projekt-Reporting
Was ist Maven? (2)Open-Source-Projekt bei ApacheEntstanden 2002 für diverse Apache-ProjekteZiel: Vereinheitlichen vonBuildVerteilungErstellen einer Projekt-WebseiteDon‘trepeatyourself!Siehe auch http://maven.apache.org/what-is-maven.html
Das „Project Object Model“ (POM)Beschreibt ein Projekt für Maven...„Artefakt-Koordinaten“Informationen für die WebseiteWas enthält das Projekt?Welche Abhängigkeiten hat das Projekt?	...als XSD-basierte XML-Datei
(Nahezu) minimales POM<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/maven-v4_0_0.xsd“><modelVersion>4.0.0</modelVersion><groupId>de.opitzconsulting</groupId><artifactId>hellomaven</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>Hello Maven</name><description>Simple Maven Project</description></project>
Convention over ConfigurationDiese Projektbeschreibung wird durch Voreinstellungen ergänzt, ...... die im „Super POM“ definiert sindhttp://maven.apache.org/pom.html#The_Super_POMDadurch kann man jetzt schon kompilieren,(JUnit-)Tests ausführen, JAR bauen, JAR verteilen,Projekt-Website generieren...
Standard-Verzeichnisstruktur/src/main/java/src/main/resources/src/main/webapp/src/test/java/src/test/resources/target/classes/target/test-classes
Maven PluginsIm Kern ist Maven eine Laufzeitumgebung für PluginsDiese stellen die eigentlichen Build-Funktionenals „Goals“ zur VerfügungDas „Super POM“ macht die gebräuchlichsten Plugins verfügbar (compile, „test“, jar, war, ...)Weitere können in Projekt-POM registriert werden
Beispiel: Jetty Plugin<!-- ... --><build>    <plugins><plugin><groupId>org.mortbay.jetty</groupId><artifactId>maven-jetty-plugin</artifactId></plugin></plugins></build><!-- ... -->...und „mvnjetty:run“ startet Jetty
Build LifecycleSequenz von „Build-Phasen“Eingebaute Lifecycle: „clean“, „default“, „site“Auszug aus Default Lifecycle:validatetestverifycompilepackageinstalldeployint.-testtest-comp.
Build Lifecycle (2)Plugin Goals können an Lifecycle-Phasen gebunden werdenBinding wird durch Packaging Type ausgewähltMaven gibt bereits Bindungen vorPlugins könnenneue Bindungen definierenBindungen und Lifecycle anpassenneue PackagingTypes definieren
Beispiel: Binding für jar/warAuszug aus dem Lifecycle Bindingfür Packaging Type jar und war
Beispiel: Custom Binding (1) <plugin><groupId>org.codehaus.mojo</groupId><artifactId>sql-maven-plugin</artifactId><!-- ... --><executions><execution>            <id>create-schema-before-test</id><!-- ... -->        <execution><execution>            <id>drop-schema-after-test</id><!-- ... -->        <execution>    </executions></plugin>Auszug aus einem POM: Konfiguration für SQL Plugin mit zwei Executions
Beispiel: Custom Binding (2)<execution><id>create-schema-before-test</id><phase>pre-integration-test</phase><goals><goal>execute</goal></goals><configuration><srcFiles><srcFile>src/main/sql/schema-create.sql</srcFile></srcFiles></configuration></execution>Auszug aus einem POM: Execution-Konfiguration für die Phase „pre-integration-test“
POMs und VererbungPOMs können von einem Parent POM erbenWurzel ist das „Super POM“Ein Parent POM kann vererben:Plugin-KonfigurationenDependenciesvieles mehr...Häufig in Verbindung mit Multimodul-Projekten
Multimodul-ProjekteEin Maven-Projekt kann nur ein Artefakt produzierenMaven forciert dadurch die Aufteilung eines Projekts auf mehrere Sub-ProjekteDiese können durch ein Multimodul-Projekt zusammengefasst und gemeinsam gebaut werdenMultimodul-POM ist meist auch Parent POM
Beispiel: Multimodul-Projektopitztoys.domainopitztoys.serviceopitztoys.projectopitztoys.service.impl„inherits from“<<runtime>>„aggregates“opitztoys.webapp„Dependency“
Dependency ManagementDependencies beschreiben Abhängigkeiten zuJava-Bibliotheken (JARs)werden über „Artefakt-Koordinaten“ spezifiziertkönnen durch „Scopes“ (compile, test, runtime, provided, ...) qualifiziert werdenwerden bei Bedarf aus einem „RemoteRepository“ heruntergeladen
Beispiel: Dependency zu JUnit 4.4<dependencies><!-- JUnit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.4</version><scope>test</scope></dependency><!-- ... --></dependencies>
Maven RepositoriesStellen Artefakte bereitLokal: 	im Filesystem („~/.m2/repository“)Remote:	als „Web Service“ zum DownloadDefault RemoteRepository: http://repo1.maven.org/maven2Weitere Repositories können im Projekt-POM registriert werden
Maven Repositories (2)repo1.maven.org~/.m2/repositoryDependencyrepository.springsource.comOn DemandDownloadpom.xmlrepository.jboss.org
Repository ManagerStellt Remote Repository Service bereitZweck:Zentraler Proxy für benötigte Remote RepositoriesBereitstellung nicht öffentlich verfügbarer JARsKontrolle über verwendete JARsVerteilung selbsterstellter Artefakte
Repository Manager (2)repo1.maven.org~/.m2/repositoryRepositoryManagerDependencyrepository.springsource.comOn DemandDownloadpom.xmlrepository.jboss.org
Repository Manager (3)Empfehlung: Repository Manager einsetzen!Pro ProjektUnternehmensweitGgf. gestaffelt: Unternehmen & pro ProjektEinige R.M.-Implementierungen:SonatypeNexus 	http://nexus.sonatype.org/JFrogArtifactoryhttp://www.jfrog.org/products.phpArchivahttp://archiva.apache.org/
Site-GenerierungWebseite mit „Projektsteckbrief“Einbetten von JavaDoc und Projektdoku.Einbetten von Berichten durch Reporting-Plugins: Checkstyle, JUnit/TestNG, Corbatura, PMD, FindBugs, JDepend, ...Beispiele: Siehe Open-Source-Projekte, die Maven verwenden...
Maven und IDEsEclipseeclipse:		Maven Plugin für Eclipsem2eclipse:	Eclipse Plugin für MavenEclipse IAM:	Integration von eclipse.orgNetBeans	Ab Version 6.7 direktes Ausführen von MavenIntelliJ	Build-In-Support für Import von Maven-Projekten
Maven und Continuous IntegrationSupport durch diverse CI-ServerCruiseControlContinuumHudsonTeamCityBamboo...
Mavenund OSGiAuf den ersten Blick passen Maven und OSGi gut zusammenDie Dependency-Konzepte unterscheiden sich aber grundlegend... Und: „Wer ist der Boss“?Es gibt aber IntegrationssupportMaven-Bundle-Pluginhttp://tinyurl.com/66q93bPaxConstructhttp://www.ops4j.org/projects/pax/constructSpringSourceBundlorhttp://www.springsource.org/bundlorTycho http://docs.codehaus.org/display/M2ECLIPSE/Tycho+project+overview
Maven 3Umfangreiches Refactoring der CodebaseNeue API für Artifact ResolutionBessere Unterstützung für IDE-IntegrationKompatibilität mit Maven 2 wird durch Integrationstests sichergestelltSiehe auchhttp://www.sonatype.com/events/meetup0309/jason-on-maven3
Fazit und BewertungStandardisierung zahlt sich bei einer großen Zahlvon Projekten ausSchnelle Ergebnisse bei Standard-AnforderungenFür komplexere Anpassungen ist jedoch umfangreiche Einarbeitung nötigPasst evtl. nicht bei sehr individuellen Anforderungen(bzw. sehr großer Aufwand)
LinksProjekt-Seitehttp://maven.apache.org/MavenThe Definitive Guidehttp://www.sonatype.com/books/maven-book/reference/DZoneRefcardhttp://refcardz.dzone.com/refcardz/apache-maven-2MavenHow Toshttp://www.sonatype.com/people/2009/04/summary-of-maven-how-tos/Nexushttp://nexus.sonatype.org/Artifactoryhttp://www.jfrog.org/products.phpm2eclipsehttp://m2eclipse.codehaus.org/
Fragen und Antworten
KontaktStefan Scheidt, Senior ArchitektOPITZ CONSULTING Gummersbach GmbHKirchstraße 6, 51647 Gummersbachstefan.scheidt@opitz-consulting.com

Automatischer Build mit Maven

  • 1.
    Stefan Scheidt, SeniorArchitektOPITZ CONSULTING Gummersbach GmbHAutomatischer Build mit Maven
  • 2.
    Wer ist OPITZCONSULTING?Last Minute:Offizieller OC 1 SeiterVon TomIhr Projektspezialist für Java, SOA und Oracle
  • 3.
    Wer bin ich?Software-Entwicklerund ArchitektTrainer und CoachSprecher und Autor
  • 4.
    (Keine) MotivationIn diesemVortrag keine Motivation für Build-AutomatisierungAber ein paar Ziele:Automatisiertes TestenContinuous IntegrationCode-Qualität
  • 5.
    Was ist Maven?„SoftwareProject Management Tool“DeklarativesBuild-SystemConvention overConfigurationWiederverwendung durch PluginsDependency ManagementTool für technisches Projekt-Reporting
  • 6.
    Was ist Maven?(2)Open-Source-Projekt bei ApacheEntstanden 2002 für diverse Apache-ProjekteZiel: Vereinheitlichen vonBuildVerteilungErstellen einer Projekt-WebseiteDon‘trepeatyourself!Siehe auch http://maven.apache.org/what-is-maven.html
  • 7.
    Das „Project ObjectModel“ (POM)Beschreibt ein Projekt für Maven...„Artefakt-Koordinaten“Informationen für die WebseiteWas enthält das Projekt?Welche Abhängigkeiten hat das Projekt? ...als XSD-basierte XML-Datei
  • 8.
    (Nahezu) minimales POM<projectxmlns="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/maven-v4_0_0.xsd“><modelVersion>4.0.0</modelVersion><groupId>de.opitzconsulting</groupId><artifactId>hellomaven</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>Hello Maven</name><description>Simple Maven Project</description></project>
  • 9.
    Convention over ConfigurationDieseProjektbeschreibung wird durch Voreinstellungen ergänzt, ...... die im „Super POM“ definiert sindhttp://maven.apache.org/pom.html#The_Super_POMDadurch kann man jetzt schon kompilieren,(JUnit-)Tests ausführen, JAR bauen, JAR verteilen,Projekt-Website generieren...
  • 10.
  • 11.
    Maven PluginsIm Kernist Maven eine Laufzeitumgebung für PluginsDiese stellen die eigentlichen Build-Funktionenals „Goals“ zur VerfügungDas „Super POM“ macht die gebräuchlichsten Plugins verfügbar (compile, „test“, jar, war, ...)Weitere können in Projekt-POM registriert werden
  • 12.
    Beispiel: Jetty Plugin<!--... --><build> <plugins><plugin><groupId>org.mortbay.jetty</groupId><artifactId>maven-jetty-plugin</artifactId></plugin></plugins></build><!-- ... -->...und „mvnjetty:run“ startet Jetty
  • 13.
    Build LifecycleSequenz von„Build-Phasen“Eingebaute Lifecycle: „clean“, „default“, „site“Auszug aus Default Lifecycle:validatetestverifycompilepackageinstalldeployint.-testtest-comp.
  • 14.
    Build Lifecycle (2)PluginGoals können an Lifecycle-Phasen gebunden werdenBinding wird durch Packaging Type ausgewähltMaven gibt bereits Bindungen vorPlugins könnenneue Bindungen definierenBindungen und Lifecycle anpassenneue PackagingTypes definieren
  • 15.
    Beispiel: Binding fürjar/warAuszug aus dem Lifecycle Bindingfür Packaging Type jar und war
  • 16.
    Beispiel: Custom Binding(1) <plugin><groupId>org.codehaus.mojo</groupId><artifactId>sql-maven-plugin</artifactId><!-- ... --><executions><execution> <id>create-schema-before-test</id><!-- ... --> <execution><execution> <id>drop-schema-after-test</id><!-- ... --> <execution> </executions></plugin>Auszug aus einem POM: Konfiguration für SQL Plugin mit zwei Executions
  • 17.
    Beispiel: Custom Binding(2)<execution><id>create-schema-before-test</id><phase>pre-integration-test</phase><goals><goal>execute</goal></goals><configuration><srcFiles><srcFile>src/main/sql/schema-create.sql</srcFile></srcFiles></configuration></execution>Auszug aus einem POM: Execution-Konfiguration für die Phase „pre-integration-test“
  • 18.
    POMs und VererbungPOMskönnen von einem Parent POM erbenWurzel ist das „Super POM“Ein Parent POM kann vererben:Plugin-KonfigurationenDependenciesvieles mehr...Häufig in Verbindung mit Multimodul-Projekten
  • 19.
    Multimodul-ProjekteEin Maven-Projekt kannnur ein Artefakt produzierenMaven forciert dadurch die Aufteilung eines Projekts auf mehrere Sub-ProjekteDiese können durch ein Multimodul-Projekt zusammengefasst und gemeinsam gebaut werdenMultimodul-POM ist meist auch Parent POM
  • 20.
  • 21.
    Dependency ManagementDependencies beschreibenAbhängigkeiten zuJava-Bibliotheken (JARs)werden über „Artefakt-Koordinaten“ spezifiziertkönnen durch „Scopes“ (compile, test, runtime, provided, ...) qualifiziert werdenwerden bei Bedarf aus einem „RemoteRepository“ heruntergeladen
  • 22.
    Beispiel: Dependency zuJUnit 4.4<dependencies><!-- JUnit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.4</version><scope>test</scope></dependency><!-- ... --></dependencies>
  • 23.
    Maven RepositoriesStellen ArtefaktebereitLokal: im Filesystem („~/.m2/repository“)Remote: als „Web Service“ zum DownloadDefault RemoteRepository: http://repo1.maven.org/maven2Weitere Repositories können im Projekt-POM registriert werden
  • 24.
  • 25.
    Repository ManagerStellt RemoteRepository Service bereitZweck:Zentraler Proxy für benötigte Remote RepositoriesBereitstellung nicht öffentlich verfügbarer JARsKontrolle über verwendete JARsVerteilung selbsterstellter Artefakte
  • 26.
  • 27.
    Repository Manager (3)Empfehlung:Repository Manager einsetzen!Pro ProjektUnternehmensweitGgf. gestaffelt: Unternehmen & pro ProjektEinige R.M.-Implementierungen:SonatypeNexus http://nexus.sonatype.org/JFrogArtifactoryhttp://www.jfrog.org/products.phpArchivahttp://archiva.apache.org/
  • 28.
    Site-GenerierungWebseite mit „Projektsteckbrief“Einbettenvon JavaDoc und Projektdoku.Einbetten von Berichten durch Reporting-Plugins: Checkstyle, JUnit/TestNG, Corbatura, PMD, FindBugs, JDepend, ...Beispiele: Siehe Open-Source-Projekte, die Maven verwenden...
  • 29.
    Maven und IDEsEclipseeclipse: MavenPlugin für Eclipsem2eclipse: Eclipse Plugin für MavenEclipse IAM: Integration von eclipse.orgNetBeans Ab Version 6.7 direktes Ausführen von MavenIntelliJ Build-In-Support für Import von Maven-Projekten
  • 30.
    Maven und ContinuousIntegrationSupport durch diverse CI-ServerCruiseControlContinuumHudsonTeamCityBamboo...
  • 31.
    Mavenund OSGiAuf denersten Blick passen Maven und OSGi gut zusammenDie Dependency-Konzepte unterscheiden sich aber grundlegend... Und: „Wer ist der Boss“?Es gibt aber IntegrationssupportMaven-Bundle-Pluginhttp://tinyurl.com/66q93bPaxConstructhttp://www.ops4j.org/projects/pax/constructSpringSourceBundlorhttp://www.springsource.org/bundlorTycho http://docs.codehaus.org/display/M2ECLIPSE/Tycho+project+overview
  • 32.
    Maven 3Umfangreiches Refactoringder CodebaseNeue API für Artifact ResolutionBessere Unterstützung für IDE-IntegrationKompatibilität mit Maven 2 wird durch Integrationstests sichergestelltSiehe auchhttp://www.sonatype.com/events/meetup0309/jason-on-maven3
  • 33.
    Fazit und BewertungStandardisierungzahlt sich bei einer großen Zahlvon Projekten ausSchnelle Ergebnisse bei Standard-AnforderungenFür komplexere Anpassungen ist jedoch umfangreiche Einarbeitung nötigPasst evtl. nicht bei sehr individuellen Anforderungen(bzw. sehr großer Aufwand)
  • 34.
    LinksProjekt-Seitehttp://maven.apache.org/MavenThe Definitive Guidehttp://www.sonatype.com/books/maven-book/reference/DZoneRefcardhttp://refcardz.dzone.com/refcardz/apache-maven-2MavenHowToshttp://www.sonatype.com/people/2009/04/summary-of-maven-how-tos/Nexushttp://nexus.sonatype.org/Artifactoryhttp://www.jfrog.org/products.phpm2eclipsehttp://m2eclipse.codehaus.org/
  • 35.
  • 36.
    KontaktStefan Scheidt, SeniorArchitektOPITZ CONSULTING Gummersbach GmbHKirchstraße 6, 51647 Gummersbachstefan.scheidt@opitz-consulting.com