Escolar Documentos
Profissional Documentos
Cultura Documentos
Bem vindo(a) ao nosso curso de Maven "Maven Pro". Aqui, voc vai aprender gratuitamente como usar o Maven para criar, compilar, testar e
distribuir seus projetos Java, de forma simples e prtica. Esta a primeira lio do curso (total de 3), e composta por: Demonstrao (vdeo),
Texto e Exerccio.
Qualidade de Software na Pr
Dependncias e repositrios;
Maven no eclipse;
Exerccio.
Agora, no Twitter
Tweets by @cleutonsampa
Cleuton Sampaio
@cleutonsampaio
O que o Maven?
Embed
O Apache Maven (http://maven.apache.org/) pode ser definido por essas duas afirmativas. exatamente o que ele e para que ele serve. Curso de MEAN developme
Antes do Maven, ns usvamos coisas como GNU Make, ou no caso do Java, Apache Ant para configurar e compilar projetos.
claro que voc pode usar a prpria IDE para isso, porm, isso diminui a sua portabilidade, em outras palavras, TODOS os desenvolvedores
devem utilizar a mesma IDE, com os mesmos plugins, na mesma verso.
Alm disso, a obrigatoriedade de uso de uma IDE impede a compilao automatizada, que ocorre em Servidores de Integrao Contnua.
Um projeto Maven uma pasta, que contm um arquivo pom.xml e um diretrio de cdigo-fonte (src). Esse arquivo gerencia todas as
dependncias do Projeto e permite constru-lo, empacot-lo, analis-lo e entreg-lo automaticamente.
Eis um exemplo de pom.xml:
A princpio, o Maven parece complicado, com todas as suas fases, plugins, repositrios e dependncias, porm, com o tempo, voc se acostuma
com ele.
Use nossa ferramenta jQana
Agora, no Facebook
O Bom Progra
3,797 likes
Like Page
#frontendwar A guerra do
est decidida!
Existem vrios tipos de projeto Java diferentes, cada um com suas caractersticas, dependncias, ambiente e empacotamento prprios. Alm disso, A guerra do Fronte
cada um utiliza verses diferentes de componentes, que so as dependncias, cujas classes devem estar nos classpaths de: Compilao, Teste e Por algum tempo, todos pen
Execuo.
OBOMPROGRAMADOR.COM
Se voc utiliza uma IDE, tudo isso fica meio transparente. s escolher o tipo de projeto que quer criar e os plugins da IDE fazem o resto. Porm,
Google+ Followers
isso, como j vimos, torna seu projeto dependente da prpria IDE. O Maven abstrai isso tudo atravs das caractersticas:
Arqutipos
Sempre que voc vai criar um projeto, tem que gerenciar as dependncias. Em outras palavras, tem que colocar no classpath todas as bibliotecas
necessrias para compilar e rodar seu projeto, certo? Alm disso, pode ter que fazer algumas configuraes, por exemplo: Verso do Java,
codificao de caracteres do cdigo-fonte, configuraes do Container (se for um projeto Java EE) etc.
Um arqutipo Maven j faz isso para voc. Existem arqutipos prontos para vrios tipos de projeto, e eles so utilizados para criar projetos, criando
o pom.xml, com as dependncias bsicas, e toda a estrutura de pastas necessrias.
1. Voc tem que armazenar os jars junto com o cdigo-fonte do projeto, no repositrio SCM (Git, SVN, CVS etc);
Marcadores
2. Voc no sabe se as verses dos jars esto adequadas;
3. Pode gerar conflito no Classpath, caso o Container tambm possua as mesmas dependncias; arquitetura diluda
Para o Maven, cada Projeto um Artefato, que pode ser compilado, empacotado e armazenado em um repositrio de artefatos. Um Projeto (46) engenharia
gera um arquivo war / ear / jar, que identificado pelas Coordenadas Maven: GroupId, ArtifactId e Version.
Cada Projeto Maven pode ter dependncias, necessrias para compil-lo e execut-lo. Essas dependncias devem estar presentes no classpath.
(45) Garantia de q
E essas dependncias, por sua vez, tambm so Projetos Maven, ou Artefatos, que possuem Coordenadas Maven. Javascript
As dependncias ficam armazenadas em um repositrio de Artefatos Maven, e seu projeto as copia (ou aponta para elas) em seu classpath no
momento da compilao ou execuo.
development
E, como essas Coordenadas Maven incluem a verso (version), voc no corre o risco de usar dependncias de verses incorretas.
MongoDB (29)
angular.js (24)
Ciclo de vida de build padronizado arquitetura de software
O Maven impe alguns padres. Isso no ruim, pois nos ajuda a organizar nosso projeto de tal forma que ele se torna realmente porttil. Voc (22) notcias (22)
pode no conhecer o projeto, mas saber como compil-lo e test-lo. livro (18) JSON
Entre esses padres, est o Ciclo de Vida de Build (ou Construo), que inclui fases distintas, por exemplo: (15) HTML 5 (13)
validate valida o projeto sem compilar;
plataformas (13)
de Software (11) linguagen
compile compila o cdigo-fonte; agile (10) micro servios
mobile (10) Continuous Deliv
test executa os testes do projeto; (9) Swift (9) dvida tcnica
maven (8) mtricas
package empacota o executvel para distribuio (JAR);
Docker (7) Dropwizard
integration-test testes de integrao; gesto de TI (7) gil
(6) ciclo de vida
verify executa verificaes sobre o cdigo-gerado; conserpro (5) dicas
mean stack (5) scrum
install instala o pacote no repositrio maven; Service (4) application lifecycle m
deploy instala o pacote no repositrio corporativo. (4) games (4) infraestrutura
programao (4) Amazon AWS
E existem fases avulsas, como a clean, que limpa a pasta binria target, onde o Maven coloca o resultado de tudo o que ele faz. Platform As A Service
As fases formam uma sequncia e, quando os resultados de uma fase anterior no existem, sero gerados. Por exemplo, se rodarmos o comando robtica (3) Amazon Elastic Ma
mvn clean package, o maven vai: (2) Diverso (2) Entrega Contn
Code (2) Jenkins (2) MapReduc
1. Limpar o contedo da pasta <projeto>/target; Raspberry (2) Requisitos
2. Executar a fase validate; angularDart (2) antipatterns
documentado (2) frontend
3. Executar a fase compile;
java (2) planning poker
4. Executar a fase test-compile, para compilar os cdigos de teste (pasta src/test/java); desenvolvimento de software
5. Executar a fase test; (1) Angular 2.0 (1) Apple
6. Executar a fase package; CISL (1) Containers (1)
Framework (1) Google App Engine
Kuaray (1) Parse.com
Responsive Web Design
distribudos (1) Smartphone
Websocket (1) Xamarin (1)
escalabilidade elstica (1)
(1) lightjava (1) netty (1) nosql
(1) php (1) statefull (1) stateless
Continuar enfiando jars dentro do projeto (dependncias com escopo system); Outubro (10)
artifactId: validador;
Pesquisar este blog
version
Esta a coordenada mais polmica, pois os desenvolvedores, em geral, no sabem versionar seus projetos. Esta coordenada a verso atual do
Projeto Maven e do Artefato que ele gera.
Podem coexistir vrias verses do mesmo artefato.
A praxe de controle de verso : MM.mm.rr, onde:
MM - Major version: Verso principal do software. Assume-se que existam diferenas funcionais significativas entre artefatos cujas
verses principais sejam diferentes. Por exemplo: de 1.x.x para 2.x.x;
mm - Minor vesion: Verso segundria do software. Existem aprimoramentos, porm, existe compatibilidade. Pode ser tambm um
milestone de correo de vrios bugs;
internal: O Artefato est liberado para uso, ou seja, considerado como finalizado. Podemos ter vrias verses do mesmo artefato,
todas finalizadas. Exemplo: 1.1.5, 1.1.6;
snapshot: O Artefato (ou aquela verso especfica) est em desenvolvimento, logo, est em evoluo. Isso significa que aquele
pacote do Artefato uma viso temporria, que pode ter mudado. Indicamos que a verso de desenvolvimento ao acrescentar o
sufixo: -SNAPSHOT. Por exemplo, considere dois pacotes do mesmo artefato, com as verses:
1.1.4-SNAPSHOT: Verso snapshot, ou seja, a verso 1.1.4 ainda est em desenvolvimento, e esta uma foto de uma
de suas compilaes;
Alguns desenvolvedores acrescentam outros sufixos verso internal, de modo a marcar milestones, por exemplo:
1.1.4-rc1: uma verso liberada, mas corresponde ao primeiro Release Candidate, ou seja, uma verso considerada aprovada para
liberao geral;
Dependncias
Uma dependncia um Artefato Maven (criado por um Projeto Maven) que deve estar no classpath de um projeto.
As dependncias ficam armazenadas em um repositrio de artefatos Maven.
No momento da compilao, o Maven busca as dependncias do repositrio e as coloca no classpath.
J t ficando um saco, no? Um monte de bl-bl-bl sem nenhuma prtica, caraca! Ento vambora fazer alguma coisa!
Ubuntu:
Mac OSX:
Open JDK 7:
https://github.com/alexkasko/openjdk-unofficial-builds#openjdk-unofficial-installers-for-windows-linux-and-mac-os-x
Oracle JDK 7:
http://download.oracle.com/otn-pub/java/jdk/7u60-b19/jdk-7u60-macosx-x64.dmg
Windows:
Open JDK 7:
https://github.com/alexkasko/openjdk-unofficial-builds#openjdk-unofficial-installers-for-windows-linux-and-mac-os-x
Oracle JDK 7:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Linux:
Altere /etc/profile e adicione: export JAVA_HOME=<pasta onde instalou o Java>. Normalmente /usr/lib/jvm/openjdk...
Mac OSX:
Windows:
Abra Computador, propriedades, escolha Configuraes avanadas do sistema, e clique em Variveis de ambiente. Crie
a varivel dentro da lista Variveis do sistema.
Instalando o Maven
Neste curso vamos usar o Maven 3.x, na ltima verso disponvel. Em nosso caso, a verso 3.2.1 (http://maven.apache.org/download.cgi).
Porm, voc pode usar qualquer verso do Maven 3, por exemplo, a 3.1.1.
Linux:
apt-get update
Mac OSX:
Windows:
Coloque a subpasta bin na varivel de ambiente path (veja o procedimento descrito anteriormente para JAVA_HOME);
Crie duas variveis de ambiente: M2_HOME e M3_HOME, apontando para a pasta onde instalou o Maven. O Maven 3 tinha um bug que fazia
com que ele usasse a varivel M2_HOME para apontar para a instalao dele. S que isso impedia a instalao de Maven 2 e Maven 3 na
mesma mquina. Por via das dvidas, crie as duas.
A documentao do Maven, que PSSIMA, diz que a varivel M2_HOME (e M3_HOME) deve apontar para a pasta onde voc descompactou
o Maven. S que os pacotes Linux copiam os arquivos para diretrios diferentes e, as vezes, separam os arquivos. Isso dificulta muito a
configurao.
H um entendimento que deveria ser a pasta onde o executvel do Maven (mvn) est instalado.
Aps instalar o Maven, abra um terminal ou prompt de comandos e digite: mvn version, para testar. Verifique se a verso exibida a 3.2.1 (ou
a ltima).
Agora sim!
Tudo instalado e pronto, certo? Ento vamos criar um projeto Maven e compil-lo. Para comear, vamos usar um Arqutipo padro, chamado:
maven-quickstart-archetype, que j vem instalado no Maven.
Vamos comear usando um terminal (ou prompt de comandos), depois eu vou mostrar como fazer isso no Eclipse.
Crie uma pasta para trabalhar, copie e cole o comando abaixo:
Linux / Mac:
mvn archetype:generate \
-DgroupId=com.exemplo.projetoteste \
-DartifactId=projetoteste \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
Windows:
mvn archetype:generate ^
-DgroupId=com.exemplo.projetoteste ^
-DartifactId=projetoteste ^
-DarchetypeArtifactId=maven-archetype-quickstart ^
-DinteractiveMode=false
A nica diferena que o caractere de continuao de linha. Como o comando muito grande, melhor quebrar em vrias linhas.
Voc criou um projeto Maven! Parabns! Vamos rever o comando que ns rodamos?
mvn archetype:generate : Estamos rodando o Maven (comando mvn) e pedindo a ele para executar o goal generate (uma funo)
de um plugin (uma biblioteca), chamado archetype. Este plugin lida com arqutipos e o goal generate gera um projeto com base
em um arqutipo;
projetoteste
|
+-"pom.xml"
|
+-src
|
+-main
| |
| +-java
| |
| +-com
| |
| +-exemplo
| |
| +-projetoteste
| |
| +-App.java
|
+-test
|
+-java
|
+-com
|
+-exemplo
|
+-projetoteste
|
+-AppTest.java
A pasta src dividida entre main e test, ambas com estrutura parecida. O cdigo-fonte funcional da aplicao fica na estrutura main e o
cdigo de teste na estrutura test. Note que ele criou o caminho do pacote usando o groupId que informamos no comando, e, inclusive, criou duas
classes: uma funcional (App.java) e uma de teste (AppTest.java).
<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>com.exemplo.projetoteste</groupId>
<artifactId>projetoteste</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>projetoteste</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Como podemos ver, as Coordenadas Maven do nosso Projeto esto definidas no pom.xml (groupId e artifactId), e ele gerou uma verso
inicial para ns (1.0-SNAPSHOT). Note que ele configurou a verso como -SNAPSHOT, j que um novo projeto.
Outra coisa que o Maven criou automaticamente foi uma dependncia para o junit, pois podemos quer testar nosso projeto e precisamos dessa
biblioteca em nosso classpath de teste.
Simples! Basta ir para a pasta onde est o arquivo pom.xml e digitar: mvn compile. O Maven vai compilar as classes funcionais (e no as de
teste) e criar uma pasta target, com esse contedo:
projetoteste
|
+-target
|
+-classes
|
+-com
|
+-exemplo
|
+-projetoteste
|
+-App.class
E voc deve ter visto, na janela do terminal, o log de compilao do Maven, com esse final:
Essa frase Build success uma das mais bonitas que eu j vi... D vontade de chorar! O problema, que ela no aparece em todo o build...
Voc deve ter notado que a classe de teste (src/test/java...) no foi compilada, certo? Isso pode ser remediado com a fase test-compile, ou ento
mandando o maven testar o nosso projeto.
Empacotando o artefato
Agora, rode o comando mvn clean package e observe o resultado:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.exemplo.projetoteste.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
Results :
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ projetoteste ---
[INFO] Building jar: C:\Users\cleuton\cursomaven\projetoteste\target\projeto
teste-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.190 s
[INFO] Finished at: 2014-06-05T13:01:24-03:00
[INFO] Final Memory: 12M/127M
[INFO] ------------------------------------------------------------------------
Ele compilou e executou os testes usando o plugin surefire, que roda testes Junit. Como nosso projeto tem uma classe de teste (dentro de
src/test/java...), ele a executou. Legal, no?
Ns encadeamos 2 fases, executadas em sequncia: clean, que limpa a pasta target, e package, que:
Valida o pom.xml;
Executa os testes;
Por que ele criou um jar? Porque o packaging do nosso projeto especificou isso. Procure no pom.xml e ver: <packaging>jar</packaging>. Ao
criar o jar, ele deu o nome do artifactId e da verso, logo, ficou: projetoteste-1.0-SNAPSHOT.jar.
Repositrio Maven
Voc deve ter notado que o Maven fez alguns downloads de artefatos, no? O log est cheio deles, principalmente na primeira vez que voc
rodar alguma das fases. Ele est indo nos repositrios remotos, entre eles o Repositrio Central do Maven (http://mvnrepository.com), e baixando
tudo o que no existe no Repositrio Local. Mas onde fica esse Repositrio Local?
Todas as dependncias do seu Projeto Maven ficam armazenadas no repositrio de artefatos Maven local, da sua conta. Esse repositrio fica
dentro da pasta oculta .m2, que fica dentro de:
do repositrio local que o Maven usa as dependncias necessrias para compilar seu projeto. Ele as coloca no classpath de compilao, e,
quando necessrio testar, no classpath de teste. Ele no as copia para dentro do seu projeto, a no ser que ele seja um war, neste caso, ele
copia para dentro da pasta WEB-INF/lib.
Vamos colocar seu Artefato no repositrio!
Na janela terminal, na pasta onde est o pom.xml, rode o comando: mvn clean install e veja o resultado:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.exemplo.projetoteste.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
Results :
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ projetoteste ---
[INFO] Building jar: C:\Users\cleuton\cursomaven\projetoteste\target\projeto
teste-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ projetoteste ---
[INFO] ------------------------------------------------------------------------
Ele fez tudo o que o package fez, e, ainda por cima, copiou o jar para dentro do seu repositrio local (a pasta .m2/repository). E, se formos
fuar no repositrio, vamos achar o caminho: com/exemplo/projetoteste/projetoteste/1.0-SNAPSHOT. A partir de agora, nosso Artefato pode ser
usado como dependncia em outros Projetos Maven.
Voc notou que, tanto no package como no install, eu usei o clean antes? Isso para garantir que o cdigo-fonte seja recompilado.
1. Criar o projeto vazio (com o mvn archetype:generate). Pode usar o arqutipo maven-quickstart-archetype mesmo);
2. Copiar o cdigo-fonte funcional para dentro da pasta src/main/java;
3. Copiar arquivos de configurao e propriedades para src/main/resources;
4. Copiar o cdigo-fonte de teste para dentro da pasta src/test/java;
5. Buscar as dependncias usando o site http://mvnrepository.com;
6. Configurar o pom.xml com as coordenadas das dependncias;
7. Instalar as dependncias que no estejam no Repositrio Central Maven;
8. Eliminar pastas lib que, porventura existam no Projeto.
Recursos
Um projeto, geralmente, possui arquivos que no so cdigo-fonte, como:
Imagens.
Estes arquivos devem ser carregados na raiz do classpath, para que voc possa us-los dentro do projeto Java. O Maven tem uma pasta padro
para isso: src/main/resources, onde voc deve colocar os arquivos.
Estes recursos sero copiados para dentro da pasta target/classes, mantendo a mesma estrutura de diretrios em que eles esto.
Se voc tiver verses diferentes de recursos para testes, ento pode coloc-los na pasta src/test/resources. Quando for executado o teste, o
Maven ir primeiro nessa pasta, antes de procurar na src/main/resources.
Pesquisando dependncias
O repositrio central do Maven no permite que pesquisemos nada nele. Ento, usamos o site http://mvnrepository.com para fazer isso. Por
exemplo, pesquisei por Hibernate:
Ele apresenta as dependncias de acordo com suas Coordenadas Maven, e podemos escolher qual verso desejamos. Depois, ele nos mostra a
configurao da dependncia pronta para ser copiada e colada no pom.xml, dentro do tag <dependencies>.
E se a dependncia no existir no repositrio?
bem difcil que isso acontea... Porm, pode ser que exista um jar seu, que no foi enviado para o Repositrio Central, ento, temos as
seguintes opes:
1. Se tivermos acesso ao cdigo-fonte do jar, podemos convert-lo em um Projeto Maven e instal-lo no Repositrio Local;
2. Se no tivermos acesso ao cdigo-fonte, ento podemos instalar o jar, com um pom.xml criado automaticamente, usando o comando:
mvn install:install-file;
Para saber se voc tem o m2e, s abrir a Janela Window / Preferences e ver se tem uma opo maven.
Voc pode, inclusive, importar o projeto que acabou de criar para dentro do Eclipse: file / import / maven / Existing maven projects e selecionar a
pasta que contm a pasta do seu projeto.
Note que o m2e tem um editor bonitinho para o pom.xml, que nos apresenta as dependncias e at a sua hierarquia.
Antes de compilar seu projeto Maven no Eclipse, temos que configurar a Workspace para usar a nossa instalao do Maven. O m2e usa um
maven embedded com verso 3.0.4, que no a verso que estamos usando. Para isto, abra o menu window / preferences, selecione maven
e installations, e acrescente a pasta onde instalou o Maven 3.2.1:
Agora voc vai usar o Maven correto! S falta uma coisinha: verificar se o Eclipse est usando uma JDK! Abra o menu window / preferences e
selecione Java e depois installed JREs. Se estiver rodando em uma JRE (o Eclipse tem compilador prprio) aponte para uma JDK:
Clique com o boto direito sobre o seu projeto e selecione Run As Maven build...:
Ento, voc vai conseguir executar um clean install exatamente como fizemos no terminal, e o log aparece na view console.
Vrios goals padres do Maven j esto configurados no menu de contexto (Run as). S falta uma coisinha para fecharmos a lio: O menu
Maven:
Ao clicar com o boto direito sobre o projeto, voc deve ter notado um menu maven.... Este menu tem vrias opes interessantes, que permitem
adicionar dependncias, plugins etc. O item mais importante o Update Project....
Quando criamos um projeto Maven no Eclipse, ele cria uma pasta chamada Maven dependencies e organiza todas as suas dependncias, que
esto no repositrio local. Bem, se voc mudar alguma coisa no pom.xml, essa lista fica desatualizada, ento, voc pode usar o Update project
para reconfigurar isso. Sempre que voc alterar o pom.xml, seja para o que for, rode um Update dependencies.
Ah, e muito importante: Se o seu projeto Maven, no use mais Project / clean! Use sempre: Run As Maven Clean, assim como Run As Maven
Package.
Exerccio
Bom, vamos ver se voc aprendeu alguma coisa... Baixe o projeto que est no zip exercicio-licao1.zip. Descompacte, converta para Maven e
instale no seu Repositrio Local. S isso.
A resposta est no zip resposta-licao1.zip, caso voc pea penico.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
A propriedade project.build.sourceEncoding diz a codificao de caracteres utilizada no cdigo-fonte. Use sempre utf-8 e acostume-se a isso.
Quando voc estiver usando o Eclipse, pode setar isso em window / preferences e Editors, alterando o Character Encoding do editor de
arquivos textuais.
As propriedades maven.compiler.source e maven.compiler.target alteram o valor de -source e -target passados para o plugin de compilao.
Coloque sempre a verso do Java que pretende usar.
http://www.obomprogramador.com/p/livros.html#qualidade
Nenhum comentrio:
Postar um comentrio
Digite seu comentrio...