Maven

História

  • Começou no projeto Jakarta Alexandria em 2001

  • Primeira versão lançada em 2004

  • Maven 2.0 saiu em 2005

  • Versão 3.0 publicada em 2010

  • 1 milhão de projetos Maven em 2012, 2 milhões em 2014

  • Em 2017 esse número passou de 10 milhões

  • Atualmente esse número está em 14 milhões

Configuração

As configurações são armazenadas no arquivo settings.xml que se encontra na pasta .m2 do diretório home ou de instalação do Maven:

<settings>
  <mirrors/>
  <servers/>
  <proxies/>
  <profiles/>
  <activeProfiles/>
  <localRepository/>
  <interactiveMode/>
  <offline/>
  <pluginGroups/>
</settings>

Configuração - Mirror

Element

Ciclos de Vida

3 Ciclos de vida distintos:

  • Clean

  • Default

  • Site

Ciclo de Vida Default

  1. validate

  2. generate-sources

  3. process-sources

  4. generate-resources

  5. process-resources

  6. compile

  1. process-test-sources

  2. process-test-resources

  3. test-compile

  4. test

  5. package

  6. install

  7. deploy

POM

Project Object Model armazenado no pom.xml.

Têm pelo menos as seguintes propriedades (Coordenadas):

  • GroupId

  • ArtifactId

  • Version

Representado por: GroupId:ArtifactId:Version

POM - Seções

Principais seções do POM:

  • Package

  • Properties

  • Build/Plugins

  • Dependencies

  • Profiles

  • Modules

POM - Package

O elemento package determina o tipo de pacote do projeto.

Alguns tipos de pacotes válidos são: jar, war, ear e pom

Outros podem ser adicionados com plugins, por exemplo jpi para Plugins Jenkins

POM - Properties

  • properties são variáveis que podem ser utilizadas no pom com a sintaxe: ${propriedade}

  • properties

  • Algumas propriedades padrão do Maven:

    • project.build.sourceEncoding

    • maven.compiler.source

    • maven.compiler.target

Dependências - Transitividade

maven dependencies

Dependências - Escopo

Limitam a transitividade das dependências

compile

Escopo padrão, disponível nos Classpaths do projeto

provided

Parecido com compile, mas não copiado no artefato final

runtime

Disponível no classpath de testes e execução mas não de compilação

Dependências - Escopo 2

test

Não requerida para usa normal da aplicação, somente para testes

system

Parecido com provided mas deve fornecer o Jar

import

Utilizado somente com artefatos de tipo pom

Dependências opcionais

Existe a tag optional declarada na tag dependency:

<optional>true</optional>

Para remover dependências existe a tag exclusions:

<exclusions>
  <exclusion>
    <groupId>sample.ProjectB</groupId>
    <artifactId>Project-B</artifactId>
  </exclusion>
</exclusions>

Comandos úteis - Dependências

Lista de dependências: list e tree

$ mvn dependency:list
$ mvn dependency:tree

Análise de dependências

$ mvn dependency:list
$ mvn dependency:tree

Comandos úteis - Dependências

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< br.com.basis.treinamento:parent >-------------------
[INFO] Building parent 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ parent ---
[INFO] br.com.basis.treinamento:parent:jar:1.0.0
[INFO] +- commons-beanutils:commons-beanutils:jar:1.9.3:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  \- commons-collections:commons-collections:jar:3.2.2:compile
[INFO] \- io.jsonwebtoken:jjwt-impl:jar:0.10.5:compile
[INFO]    \- io.jsonwebtoken:jjwt-api:jar:0.10.5:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.810 s
[INFO] Finished at: 2019-05-06T17:24:20-03:00
[INFO] ------------------------------------------------------------------------

Plugins Maven

  • Estendem o Ciclo de Vida Maven

  • Operações comuns são implementadas com Plugins

  • Tem configurações próprias

  • Tem objetivos (goals)

Plugins - Execução e Configuração

  • Objetivos vinculados a etapas do Ciclo de Vida

  • Configurações globais ou por execução

<executions>
  <execution>
    <id>unpack-dependencies</id>
    <phase>package</phase>
    <goals>
      <goal>unpack-dependencies</goal>
    </goals>
    <configuration>
      <!-- Configurações específicas -->
    </configuration>
  </execution>
</executions>

Comandos úteis

help:describe

$ mvn help:describe \
  -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:3.8.1

$ mvn help:describe -Ddetail -Dgoal=compile \
  -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:3.8.1

Perfis

  • Perfis (profiles) permitem parametrização condicional

  • Deixa as builds portáveis

  • Podem ser definidos:

    • localmente no projeto

    • globalmente por usuário

    • globalmente por instalação de Maven

Perfis - Ativação

Os profiles podem ser ativados por:

  • Explicitamente (paramêtro -P)

  • No settings.xml com a tag activeProfiles

  • Baseado em variáveis de ambiente

  • Sistema Operacional

  • Presença ou ausência de arquivos

Perfis - Escopo

Os seguintes elementos podem ser configurados:

  • repositories

  • pluginRepositories

  • dependencies

  • plugins

  • properties

  • modules

  • reporting

  • dependencyManagement

  • distributionManagement

  • build/defaultGoal

  • build/resources

  • build/testResources

  • build/finalName

Projetos multi-módulos

Os projetos multi-módulos Maven são gerenciados pelo Reactor que:

  • Junta os módulos a construir

  • Ordena os módulos

  • Executa a construção dos módulos na ordem

Projetos multi-módulos

A ordem de construção é resolvida assim:

  • Um módulo dependendo de outro no mesmo projeto

  • Um plugin utilizado como declaração por um outro módulo

  • Um plugin utilizado como dependencia de outro módulo

  • Uma extensão utilizada por um módulo do projeto

  • A ordem de declaração no elemento <modules>

Projetos multi-módulos

pluginManagement e dependencyManagement servem a centralizar informações sobre dependências

Os plugins e dependências declaradas nessas tags servem a definir uma configuração padrão.

Os módulos herdam das propriedades do parent.

Projetos multi-módulos

Elementos herdados do Parent:

  • Dependências

  • Listas de Plugins

  • Execução de Plugins com os ids

  • Configuração de Plugin

  • Resources

  • Developers and contributors

Projetos multi-módulos

Os comandos maven executados na raiz do projeto são executados em todos os módulos

A opção -pl permite construir módulos específicos:

$ mvn clean install -pl modulo-a -am

Comandos úteis

help:effective-pom

Gera o pom.xml final, efetivamente executado, resolvendo propriedades herdadas e mescladas

$ mvn help:effective-pom