Media:IntermediateMaven

advertisement
Intermediate Maven
Michael Youngstrom
Notes
•
•
•
•
This is a training NOT a presentation
Please ask questions
No making fun of my microphone
Prerequisites
– Introduction to Maven
– Basic Java and XML skillz
Outline
•
•
•
•
Review Introduction to Maven
Plugins
Properties
Profiles
Review
•
•
•
•
•
Maven is a build tool
Maven project Structure
Maven has a build lifecycle
A maven artifact is identified with GAV
Maven dependencies are glorious!
Maven Plugins
• Plugins extend Maven
• Plugins are identified with GAV
• Two ways to execute a plugin
– Hook into build lifecycle
– Invoke standalone
Hooking into build lifecycle
• Allows plugin to execute as part of maven build
• Three items to configure a plugin:
– Phase
– Goal
– Configuration
Plugin Example
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
...
</configuration>
<executions>
<execution>
<id>execute</id>
<phase>validate</phase>
<goals><goal>enforce</goal></goals>
<configuration>
...
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Plugin Documentation
• Use Plugin reference documentation!
Full Name
Default Phase
Configuration
Plugin Configuration
• Configuration parameters go in the configuration
element.
<project>
...
<plugin>
...
<configuration>
<fail>false</fail>
</configuration>
<executions>
<execution>
...
<configuration>
<failFast>true</failFast>
</configuration>
</execution>
</executions>
</plugin>
</project>
PluginManagement
• PluginManagement configures a plugin without
executing it
– Version
– Configuration
– Executions
• To execute use:
– Regular Plugin entry
– Plugin standalone command
Plugin Management Example
<project>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
...
<ignoreCache>true</ignoreCache>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Plugin Inheritance
• This is a rather complex topic
• Plugin inherits PluginManagement configuration
• Plugins and PluginManagement can inherit
config from parent
• Beyond that you can figure it out on your own
How to Manage POM Complexity
• Effective POM
–
–
–
–
–
–
Flattens POM configuration
Dependency and DependencyMangement is resolved
Plugin and PluginManagement is resolved
Executions are Resolved
Properties are Resolved (more on this later)
Profiles are Resolved (more on this later)
• To use:
– Select the “Effective POM” tab in pom editor in Eclipse
– Invoke mvn help:effective-pom on command line
Invoking Plugins Standalone
• Plugins can also be invoked adhoc from command
line
– GroupId:ArtifactId:Version:Goal
– Will use Plugin Management configuration
– Configuration can be provided by system properties
mvn org.apache.maven.plugins:maven-enforcer-plugin:1.0:enforce
• Can be shortened
mvn enforcer:enforce
• Must be configured in pom plugin or in settings.xml
Plugin Documentation Helps
• Plugin reference documentation rocks!
Short Name
Full Name
Setting Configuration Standalone
• Expression: the property key to this parameter
Expression Key
mvn enforcer:enforce –Denforcer.fail=false
Lab 1: Maven Plugins
https://tech.lds.org/wiki/Intermediate_Maven#Lab
_1_Maven_Plugins
Maven Properties
• Properties are the glue that tie configuration
together
• Properties can come from several places:
– <properties/> element in pom
– System Properties
– Project Object Model
• Properties can be used as a value just about
anywhere
– Plugin Configuration
– Resource Filtering
• Properties can only be simple primitive values
Maven Property Example
<project>
...
<properties>
<skipEnforcer>true</skipEnforcer>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
<skip>${skipEnforcer}</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
POM Properties Element
• Properties can be nested
<project>
...
<properties>
<skipTests>true</skipTests>
<skipEnforcer>${skipTests}</skipEnforcer>
</properties>
</project>
System Properties
• Supplied to the command line using “-D”
– mvn install –DskipEnforcer=true
• Supplied in the IDE using parameters dialog
• System Properties override POM properties
Project Object Model Properties
• Properties can be derived from POM structure
• POM elements = property keys
– Expression: ${project.version}
• Element: <project><version/></project>
– Expression: ${project.artifactId}
• Element: <project><artifactId/></project>
– Expression: ${project.build.sourceDirectory
• <project><build><sourceDirectory/></build></project>
• Special properties:
– ${basedir}: Directory of current project
– ${maven.build.timestamp} : Start of build.
Inherited Properties
• Properties can be inherited and overridden
<project>
...
<properties>
<skipTests>true</skipTests>
<skipEnforcer>${skipTests}</skipEnforcer>
</properties>
</project>
<project>
<parent>
...
</parent>
<properties>
<skipTests>false</skipTests>
</properties>
</project>
• Current property value depends upon context
Resource Filtering
• Project resources can use properties
• Resources filtered in process-resources phase
• Filtering can be turned off on a per resource
directory basis
<project>
...
<properties>
<someProperty>SomeValue</someProperty>
</properties>
</project>
Some Text File in
/src/main/resources:
${someProperty}
Some Text File in
/src/main/resources:
SomeValue
Properties and Plugin Expression
• Properties can also override plugin expression
defaults
Expression Key
Skip Enforcer Example #1
<project>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</project>
Skip Enforcer Example #2
<project>
<properties>
<enforcer.skip>true</enforcer.skip>
</properties>
<build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
</plugin>
</build>
</project>
Skip Enforcer Example #3
mvn clean install –Denforcer.skip=true
<project>
<build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
</plugin>
</build>
</project>
Lab 2: Maven Properties
https://tech.lds.org/wiki/Intermediate_Maven#Lab
_2_Maven_Properties
Maven Profile
• Allows activating a set of alternative
configurations
• Works for:
– Properties
– Dependencies
– Plugins
– etc.
• Inherits and extends non-profile configuration
Profile Example
<project>
...
<profiles>
<profile>
<id>enforcer</id>
<activation/>
<properties>
<enforcer.skip>false</enforcer.skip>
</properties>
</profile>
</profiles>
</project>
Profile Activation
• Can be Activated:
– By Default
– Explicitly by name
– Based on a Property
– Based on operation system
– Existence of a file
Activation from Command Line
mvn clean install –P enforcer
• Activates a profile explicitly
• Multiple profile ids are comma delimited
Activation in IDE Build
• Can be set in build command configuration
Activation in IDE Development
• Can be set in project’s Maven config
• Usually used to change development mode
Lab 3: Maven Profiles
https://tech.lds.org/wiki/Intermediate_Maven#Lab
_3_Maven_Profiles
Summary
•
•
•
•
Plugins extend Maven’s capabilities
Properties are the glue in Maven configuration
Profiles enable alternate configurations
Next training understanding Stack Starter’s
Maven Configuration
Download