+ All Categories
Home > Software > Intelligent Projects with Maven - DevFest Istanbul

Intelligent Projects with Maven - DevFest Istanbul

Date post: 08-Jul-2015
Category:
Upload: mert-caliskan
View: 207 times
Download: 0 times
Share this document with a friend
Description:
This slidedeck details the Maven framework v3.2.3 with its architecture and offers ways to create some sample projects!
58
Intelligent Projects with Maven We’ll examine Maven framework with its architecture and create some sample projects! Dev Fest Istanbul December 2014 Mert ÇALIŞKAN @mertcal
Transcript
Page 1: Intelligent Projects with Maven - DevFest Istanbul

Intelligent Projects with Maven

We’ll examine Maven framework with its architecture and create some sample projects!

Dev Fest IstanbulDecember 2014Mert ÇALIŞKAN

@mertcal

Page 2: Intelligent Projects with Maven - DevFest Istanbul

Mert ÇALIŞKAN

• ’02 Hacettepe Graduate

• Lecturer @ Hacettepe

• 10+ Years of Enterprise Java Experience

• Coder @ t2.com.tr

• Author

• Open Source Software Advocate

• Founder of Ankara JUG

• Linkedin Profile available @ bit.ly/mertcaliskan

Page 3: Intelligent Projects with Maven - DevFest Istanbul

My Books

Details available at http://amazon.com/author/mert

Page 4: Intelligent Projects with Maven - DevFest Istanbul

How many of you heard about Maven?Or using it?

Page 5: Intelligent Projects with Maven - DevFest Istanbul

• A project management framework from ASF.

• It’s a Uniform Build System.

• Making the build as easy as possible.

• Comprehensive model for software projects.

Maven is…

Page 6: Intelligent Projects with Maven - DevFest Istanbul

And Maven also is…

Page 7: Intelligent Projects with Maven - DevFest Istanbul

• Convention over Configuration (konfigurasyon yerine kurallar)

• Common Interfaces The time of build engineers is over Stop building the build and focus on development !

• Dependency Management Public repositories

• Plugin Architecture

• Documentation Generate documentation, reports ...

What Maven provides

Page 8: Intelligent Projects with Maven - DevFest Istanbul

• You need JDK (not the JRE).

• Just download the binary from http://maven.apache.org/download.cgi.

• Current latest version is 3.2.3.

• Open it up to a folder and add it to the path of the OS / Environment Variable.

Installing Maven

Page 9: Intelligent Projects with Maven - DevFest Istanbul

To understand Mavenone first need to

understandthe

Project Object Model(POM)

Page 10: Intelligent Projects with Maven - DevFest Istanbul

• It is what makes your project a Maven Project.

• It’s an XML file.

• Not just for building the project; but also, project’s relationship, list of team members, license, SCM and etc.

• Not only for Java projects

• you can build FLEX code with appropriate plugins

• you can build Microsoft binaries from C# code

POM

Page 11: Intelligent Projects with Maven - DevFest Istanbul

Anatomy of POM<project ...> <parent />

<groupId /> <artifactId /> <version /> <packaging /> <developers /> <contributors /> <scm>... </scm><build>

<plugins>....</plugins> </build> <dependencies>....</dependencies> <repositories>....</repositories> <pluginRepositories>... </pluginRepositories> <profiles>...</profiles> <reporting>... </reporting>

</project>

Page 12: Intelligent Projects with Maven - DevFest Istanbul

Simplest POM

<project> <modelVersion>4.0.0</modelVersion> <groupId>com.devfesttr</groupId> <artifactId>MavenApp</artifactId> <version>1.0.0</version></project>

$ mvn install

compile coderun tests

package as jardeploy to local repo}

Page 13: Intelligent Projects with Maven - DevFest Istanbul

Simplest POM• GAV (groupid - artifactid - version) is the unique

identifier for the project.

• They are also called as the coordinates.

• groupid: is the identifier for a collection of related modules. It’s more like a hierarchy that starts with the organization and then move on with the specific project group. (com.devfesttr)

• artifactid: is the unique identifier or the simple name of the module within a group (MavenApp)

• version: identifier for the build number of the project.

Page 14: Intelligent Projects with Maven - DevFest Istanbul

Question here is

How is that possible with 6 lines of XML?

Where do I define the source folders, test folders and all other

stuff ?

Page 15: Intelligent Projects with Maven - DevFest Istanbul

• Same analogy with java.lang.Object

• usr/share/Java/maven/lib/maven-model-builder-3.2.3.jar:org/apache/maven/model/pom-4.0.0.xml

• Standard directory layout

• Repo def. for http://repo1.maven.org/maven2

• To see the merged POM: mvn help:effective-pom

Super POM

Page 16: Intelligent Projects with Maven - DevFest Istanbul

Let’s create a Maven Project

• We’ll be using Eclipse Kepler

• IDE for version JavaEE Developers is shipping with Maven Plugins.

• We’ll also create a project with the archetype soon.

Page 17: Intelligent Projects with Maven - DevFest Istanbul

• 3 built-in Life Cycles default: handles project deployment clean: clean project files generated by a build site: generate project’s site doc.

• Each lifecycle consists of phases in specific order.

• Zero or more goals attached to each phase.

Build LifeCycle

• Process for building and distributing an artefact is clearly defined.

Page 18: Intelligent Projects with Maven - DevFest Istanbul

Build LifeCycle

default

integration-test

validate

compile

test

verify

install

deploy

Page 19: Intelligent Projects with Maven - DevFest Istanbul

mvn integration -test

default

integration-test

validate

compile

test

verify

install

deploy

mvn phase mvn phase:goal

mvn phase phase:goal mvn phase:goal phase:goal

integration-test

validate

compile

test

Page 20: Intelligent Projects with Maven - DevFest Istanbul

Build LifeCycle

• validate - validate the project is correct and all necessary information is available

• 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.

Page 21: Intelligent Projects with Maven - DevFest Istanbul

Build LifeCycle• 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.

Page 22: Intelligent Projects with Maven - DevFest Istanbul

default - full bundle (21 steps)

validate Validates whether project is correct and all necessary information is available to complete the build process.

initialize Initialises build state, for example set properties.generate-sources Generate any source code to be included in compilation phase.process-sources Process the source code, for example, filter any value.generate-resources Generate resources to be included in the package.

process-resources Copy and process the resources into the destination directory, ready for packaging phase.

compile Compile the source code of the project.

process-classes Post-process the generated files from compilation, for example to do bytecode enhancement/optimization on Java classes.

generate-test-sources

Generate any test source code to be included in compilation phase.

process-test-sources Process the test source code, for example, filter any values.

test-compile Compile the test source code into the test destination directory.

process-test-classes Process the generated files from test code file compilation.

Page 23: Intelligent Projects with Maven - DevFest Istanbul

default - cont’dtest Run tests using a suitable unit testing framework.

prepare-package Perform any operations necessary to prepare a package before the actual packaging.

package Take the compiled code and package it in its distributable format, such as a JAR, WAR, or EAR file.

pre-integration-test Perform actions required before integration tests are executed. For example, setting up the required environment.

integration-test Process and deploy the package if necessary into an environment where integration tests can be run.

post-integration-test

Perform actions required after integration tests have been executed. For example, cleaning up the environment.

verify Run any check-ups to verify the package is valid and meets quality criterias.

install Install the package into the local repository, which can be used as a dependency in other projects locally.

deploy Copies the final package to the remote repository for sharing with other developers and projects.

Page 24: Intelligent Projects with Maven - DevFest Istanbul

• It’s where Maven can ease the development when you have hundreds of modules.

• You may also depend on external frameworks and maven will fetch them from repositories.

• It happens with the Coordinates ! (GAV factor)

Dependency Mechanism

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> <scope>compile</scope> <optional>false</optional></dependency>

Page 25: Intelligent Projects with Maven - DevFest Istanbul

• Transitive Dependencies are introduced with Maven version 2.0.

• It allows you get the libraries that your own dependencies require and include them automatically. You don’t need to take care of those explicitly.

• There is no limit to the number of levels on dependencies.

Transitive Dependencies

Page 26: Intelligent Projects with Maven - DevFest Istanbul

• If projectX depends on projectY and projectY depends on projectZ, the owner of projectX can define an exclusion on projectZ for not to fetch it while fetching projectY.

Dependency Exclusion

X

Y

Z

Page 27: Intelligent Projects with Maven - DevFest Istanbul

Usage of <exclusion>

<dependency>

<groupId>mycompany</groupId>

<artifactId>myproject</artifactId>

<version>1.0</version>

<exclusions>

<exclusion>

<groupId>mycompany</groupId>

<artifactId>myotherproject</artifactId>

</exclusion>

</exclusions>

</dependency>

Page 28: Intelligent Projects with Maven - DevFest Istanbul

• Let’s say projectY releases itself and mark its dependency on projectZ as optional. When projectX depends on the projectY, project X will only depend on the Y but not the Z. But it may also add the Z as a dependency if needed.

Optional Dependencies

X

Y

Z(optional)

Page 29: Intelligent Projects with Maven - DevFest Istanbul

Usage of <optional>

<dependency>

<groupId>mycompany</groupId>

<artifactId>projectZ</artifactId>

<version>1.0</version>

<optional>true</optional>

</dependency>

• ProjectY defines ProjectZ as below with optional dep.

Page 30: Intelligent Projects with Maven - DevFest Istanbul

Sample <dependencies>

<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.2.Final</version> </dependency> </dependencies>

Page 31: Intelligent Projects with Maven - DevFest Istanbul

Scope for Dependencies

compile

testruntime

provided

system import

C T RCompile

Classpaths

Test Runtime

Page 32: Intelligent Projects with Maven - DevFest Istanbul

Scope for Dependencies

compile default scope, compile scoped dependencies will be in classpathCTR

provided similar to the compile, artefact should be provided by JDK / container @ runtimeCT

not needed for compilation but need @ runtime runtimeTR

testT dependency only needed for test compilation & execution

with maven 2.0.9...dependency to be replaced with the dependencies in that POM's <dependencyManagement> section.

import---

systemCT same as provided, but artefact should be provided explicitly with <systemPath />

Cla

sspa

th

Page 33: Intelligent Projects with Maven - DevFest Istanbul

Versioning and Ranges

<major>.<minor>.<incremental> - <qualifier>

1.2.3 / 1.2.3-alpha-01

1.2.3-alpha-2 > 1.2.3-alpha-10

Be careful with string comparison, ordering at the qualifiers...

(, ) - Exclusive [, ] - Inclusive

<version>[3.8 , 4.11)</version>

<version>[3.8]</version>

<version>[ , 3.8]</version>Dependency Mediation

Page 34: Intelligent Projects with Maven - DevFest Istanbul

Release and Snapshot Versioning

• Snapshot versioning: Used by the projects during development as it implies that the project is still under development and it may change. <version>0.0.2-SNAPSHOT</version>

• Release versioning: It’s the versioning that is assumed never to change. Only to be used for a single state of the project when it is released then updated to a next snapshot. <version>0.0.1</version>

Page 35: Intelligent Projects with Maven - DevFest Istanbul

Archetypes

• Templates for Maven projects

• Descriptor XML files + Velocity templates

• To create a Maven project:

mvn archetype:generate -DgroupId=com.devfesttr -DartifactId=sampleApp -Dversion=1.0-SNAPSHOT -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.0

Page 36: Intelligent Projects with Maven - DevFest Istanbul

Let’s create a Maven Project

with an archetype

• By using an archetype from JBOSS repository

• https://repository.jboss.org/nexus/content/repositories/releases/archetype-catalog.xml

• We will have Domain classes, Web Pages, in memory database, REST services and etc.

Page 37: Intelligent Projects with Maven - DevFest Istanbul

How Maven resolve versions?

Page 38: Intelligent Projects with Maven - DevFest Istanbul

A : A : 1.0

B : B : 1.0C : C : 1.0

B : B : 2.0commons-loggingcommons-logging

1.0.1

commons-loggingcommons-logging

1.1.1

commons-loggingcommons-logging

1.1.1

D : D : 1.0

commons-loggingcommons-logging

1.0.4

Which B will Maven choose?

B:2.0 the highest one?

G:A: V

Page 39: Intelligent Projects with Maven - DevFest Istanbul

A : A : 1.0

B : B : 1.0C : C : 1.0

B : B : 2.0commons-loggingcommons-logging

1.0.1

commons-loggingcommons-logging

1.1.1

commons-loggingcommons-logging

1.1.1

D : D : 1.0

commons-loggingcommons-logging

1.0.4

Maven will choose the closest one.

Page 40: Intelligent Projects with Maven - DevFest Istanbul

A : A : 1.0

B : B : 1.0C : C : 1.0

B : B : 2.0commons-loggingcommons-logging

1.0.1

commons-loggingcommons-logging

1.1.1

commons-loggingcommons-logging

1.1.1

D : D : 1.0

commons-loggingcommons-logging

1.0.4

Whichcommons-logging?

???

?

Page 41: Intelligent Projects with Maven - DevFest Istanbul

A : A : 1.0

B : B : 1.0C : C : 1.0

B : B : 2.0commons-loggingcommons-logging

1.0.1

commons-loggingcommons-logging

1.1.1

commons-loggingcommons-logging

1.1.1

D : D : 1.0

commons-loggingcommons-logging

1.0.4

The Sequential first at the same distance…

Page 42: Intelligent Projects with Maven - DevFest Istanbul

The Final Graph…

A : A : 1.0

B : B : 1.0C : C : 1.0

commons-loggingcommons-logging

1.0.4

D : D : 1.0

Page 43: Intelligent Projects with Maven - DevFest Istanbul

Question:Project A will work in the end

OR not?

A : A : 1.0

B : B : 1.0C : C : 1.0

commons-loggingcommons-logging

1.0.4

D : D : 1.0

Page 44: Intelligent Projects with Maven - DevFest Istanbul

Managing Projects’ Dependencies

Page 45: Intelligent Projects with Maven - DevFest Istanbul

Inheritance

ParentApp

ChildApp

<<extends>>

<project> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.devfesttr</groupId> <artifactId>ParentApp</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <groupId>devfesttr.workshop</groupId> <artifactId>ChildApp</artifactId> <version>1.0.0-SNAPSHOT</version></project>

Page 46: Intelligent Projects with Maven - DevFest Istanbul

Aggregation

ProjectA ProjectB ProjectC<<depends>> <<depends>>

root $ cd ProjectCprojectC $ mvn compileprojectC $ cd ..root $ cd ProjectBprojectB $ mvn compileprojectB $ cd ..root $ cd ProjectAprojectA $ mvn compile

} 8 lines !!!

Page 47: Intelligent Projects with Maven - DevFest Istanbul

Aggregation

modulesapp

ProjectA ProjectB

ProjectC

<<module>><<module>>

<<module>>

root $ cd modulesappmodulesapp $ mvn compile

modulesapp:

<project> <modelVersion>4.0.0</modelVersion> <groupId>com.devfesttr</groupId> <artifactId>modulesapp</artifactId> <packaging>pom</packaging> <version>1.0</version> <name>modulesapp</name> <modules> <module>projectA</module> <module>projectB</module> <module>projectC</module> </modules></project>

Page 48: Intelligent Projects with Maven - DevFest Istanbul

Question here is:With mvn compile

which module will compile first?

<modules> <module>projectA</module> <module>projectB</module> <module>projectC</module> </modules>

Page 49: Intelligent Projects with Maven - DevFest Istanbul

Repositories

• To manage build artefacts and dependencies

• local or remote repositories

• Can store jar, war, ear, ejb, rar ....

• Maven looks to at least 2 repository if none specified - local one (under user home) - http://repo.maven.apache.org/maven2 (defined in uber-pom)

• Release & Snapshot repositories

Page 50: Intelligent Projects with Maven - DevFest Istanbul

Repositories

<repository><id>jboss-repo</id><name>The Release JBoss maven repo</name><url>http://repository.jboss.org/maven2</url><releases>

<enabled>true</enabled></releases>

</repository><repository>

<id>jboss-snapshot-repo</id><name>The Snapshot JBoss maven repo</name><url>http://snapshots.jboss.org/maven2</url><snapshots>

<enabled>true</enabled></snapshots>

</repository>

Page 51: Intelligent Projects with Maven - DevFest Istanbul

Plugins• Plugin-oriented Architecture

plugin for even compiling the code..

• A maven artefact w/ descriptor (plugin.xml) and one or more MOJOs

• A MOJO is a Maven plain Old Java Object. Each mojo is an executable goal in Maven, and a plugin is a distribution of one or more related MOJOs.

• In short, a MOJO is a maven goal, to extend functionality not already found in Maven.

• Plexus as its IoC. (Guice also introduced with version 3.x) Why not Spring?

• List of plugins supported by Maven Project. https://maven.apache.org/plugins

Page 52: Intelligent Projects with Maven - DevFest Istanbul

Plugin Development<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>com.devfesttr</groupId><artifactId>hello-maven-plugin</artifactId><version>1.0-SNAPSHOT</version><packaging>maven-plugin</packaging><build>

<plugins><plugin>

<groupId>org.apache.maven.plugins</groupId><artifactId>maven-plugin-plugin</artifactId><version>3.2</version><configuration>

<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound></configuration><executions>

<execution><id>mojo-descriptor</id><goals>

<goal>descriptor</goal></goals>

</execution></executions>

</plugin></plugins>

</build>

Page 53: Intelligent Projects with Maven - DevFest Istanbul

Plugin Development

<dependencies><dependency>

<groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>2.0</version>

</dependency><dependency>

<groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.2</version>

</dependency></dependencies>

</project>

Page 54: Intelligent Projects with Maven - DevFest Istanbul

Plugin DevelopmentMojo Code

import org.apache.maven.plugin.AbstractMojo;import org.apache.maven.plugin.MojoExecutionException;import org.apache.maven.plugins.annotations.Mojo;

@Mojo( name = "sayhi")public class GreetingMojo extends AbstractMojo { public void execute() throws MojoExecutionException { getLog().info( "Hello world." ); }}

Page 55: Intelligent Projects with Maven - DevFest Istanbul

Use the plugin<build>

<plugins><plugin>

<groupId>com.devfesttr</groupId><artifactId>hello-maven-plugin</artifactId><version>1.0-SNAPSHOT</version><executions>

<execution><phase>compile</phase><goals>

<goal>sayhi</goal></goals>

</execution></executions>

</plugin></plugins>

</build>

Page 56: Intelligent Projects with Maven - DevFest Istanbul

What we did w/ plugins in PrimeFaces

• Component Class

• Tag Handler Class

• Declare Component, Tag, Renderer classes in faces-config.xml

• Declare facelet tag definition

• Declare tld tag definition

• maven-jsf-plugin

• plugin available @ http://repository.primefaces.org/org/primefaces/maven-jsf-plugin

Page 57: Intelligent Projects with Maven - DevFest Istanbul

settings.xml

• Maven provides 2 settings file,

• Local settings.xml at %USER_HOME%/.m2/settings.xml

• Global settings.xml at %M2_HOME%/conf/settings.xml

• These files are not bundled with Maven project and don’t get distributed.

• If both files exist, their contents get merged.

• Local settings.xml overrides the global one.

Page 58: Intelligent Projects with Maven - DevFest Istanbul

Thank you..!


Recommended