Maven: Introdução
AVISO
“Este é uma apresentação pessoal. As
opiniões aqui expressadas são de única
responsabilidade minha, e nada referem-se
às da empresa para qual trabalho.”
● Programa há quase 10 anos
● Software Engineer @ Red Hat
● FATEC SJC - UFABC
● Dados Abertos (SJC Digital - sjcdigital.com)
● JUG Vale
Sobre William Antônio Siqueira
Objetivo
Hoje nós vamos:
- Entender a importância da ferramenta Maven e a motivação para sua
existência
- Passar pelos principais conceitos
- Mostrar aplicações com maven
- Uma super básica, o TUINTER
- Uma aplicação pequena: o SorteiaAPP
- Uma média, o Call4Papers
- Uma aplicação avançada: o jBPM
Maven
Ferramenta da Apache Foundation para gerenciamento de projetos
- Padroniza estrutura de projetos
- Controla ciclos de execução (rodar, construir, testar, etc)
- Facilita gerenciamento de bibliotecas usadas pelo projeto
- Pode fazer praticamente tudo através de plugin
Vamos por partes
Vamos fazer um projeto
Você tem uma grande ideia de um projeto que vai mudar o mundo
O projeto vai fazer um monte de coisa como salvar informações, acessar redes
sociais e minerar bitcoin… é um projeto grande
Ninguém desenvolve nada sozinho
Para realizar o seu projeto você pesquisa na internet bibliotecas e descobre
algumas que vão te ajudar: JSalvaCoisas, JRedesSociais e JBitcoin.
Rapidamente no seu computador você baixa cada uma delas e usa em seu
projeto. Por exemplo, um projeto do Eclipse.
Passado uns meses, um colega toma conhecimento, ele se dispõe a ajudar a
criar uma nova funcionalidade. Você manda pra ele o projeto do Eclipse
Tá tudo estranho
O que era pra ser uma ajuda vira uma dor de cabeça! AO importar o projeto um
monte de erro aparece, seu amigo não consegue ajudar. Após um tempo de
sofrimento você lembra que seu amigo também precisa das bibliotecas:
JSalvaCoisas, JRedesSociais e JBitcoin. Ele corre e baixa, muitos erros são
resolvidos, mas ainda sim seu amigo não consegue resolver nada!
As coisas mudam...
Muito tempo depois vocês descobrem que seu amigo baixou outra versão das
bibliotecas JSalvaCoisas, JRedesSociais e JBitcoin que já tinham sido
atualizadas e seu código na verdade usava uma versão antiga, você nem fazia
ideia!
Após descobrir a versão e achar ela na internet, seu amigo consegue finalmente
ajudar você, adiciona imagens legais ao projeto e ele manda pra você de novo o
projeto do Eclipse.
Organizando as coisas
Chega pra você o projeto, ele roda localmente. Você nota que seu amigo colocou
no meio do código imagens espalhadas, junto com arquivos Java, você então cria
um diretório só para imagens e coloca lá, então comunica seu amigo onde ficam
as imagens, na pasta “imagens” agora. Também faz uma estrutura para o projeto.
Você e seu colega se entendem e conseguem juntos rodar o projeto
Nem todo mundo usa o que você usa!
O projeto é um sucesso e com o crescimento novas pessoas começam a
trabalhar com vocês. Logo você descobre que nem todo mundo usa Eclipse e por
isso cria “scripts” que vão compilar os arquivos Java e executar o projeto sem
depender do Eclipse. Você usa Windows, no entanto, alguns usuários de Linux
querem ajudar no projeto, e você vai precisar de arquivos shell para executar no
linux, você está com energia, cria todos os arquivos para todo mundo. Sua equipe
de 5 pessoas consegue trabalhar juntos, sucesso!
Projetos crescem, a bagunça também
Agora você usa dezenas de bibliotecas de diversas versões. Para resolver isso
cria uma pasta compartilhada com todos os arquivos .jar que todo mundo pode
pegar em algum lugar nas nuvens.
Depois de um tempo você nota que alguns arquivos .jar estão duplicados, pois as
bibliotecas que você usa também podem ser usadas por outras pessoas. Alguns
inclusive são duplicados em outros sub-projetos!
O negócio fica pior quando há erros estranhos durante a execução do projeto
como: ClassNotFoundException, ClassCastException (problemas que acontecem
por causa de conflitos de classes carregadas)
Trocar pessoas em um projeto pode não ser fácil
Sua equipe cresceu, algumas pessoas saem do projeto, não querem mais, você
precisa de novos contribuidores e a cada novo contribuidor você precisa que ele
baixe aquele monte de jar repetido, arrume scripts para rodar no computador
dele, entenda a estrutura do projeto… Tempo perdido e desgastante.
O seu projeto vira um fardo
Depois de meses, cheio de JARs, scripts malucos e falta de padrão, hoje seu
projeto é um fardo, bagunçado, ninguém entende e você não sabe mais o que
fazer…
Vamos ver como muitos desses problemas (e muitos outros que não citamos
aqui) poderiam ter sido resolvidos com Maven!
Configuração e estrutura Padronizada com Maven
Quando um projeto é criado utilizando Maven a estrutura e a configuração é
padronizada. Toda configuração acontece em um arquivo chamado pom.xml
que fica na raiz do projeto. Só isso já resolve muito problema
Configuração e estrutura Padronizada com Maven
- Na raiz do projeto sempre terá um pom.xml
- Em src é onde colocamos o código da aplicação:
- src/main/java: Código Java
- src/main/resources: arquivos que podem ser lidos, mas não são .java
- src/test/java: Código de testes com Java
- src/test/resources: Arquivos que que podem ser lidos durante o teste
- Quando o projeto é construído os arquivos vão
para um diretório chamado target
Execução e construção do projeto com Maven
O comando para executar o maven é mvn. Você usa esse comando passando
para o maven o que você quer fazer, o ciclo, podendo chamar um após outro.
Alguns ciclos:
● compile: compila
● package: Empacota o projeto (cria um JAR, WAR, etc)
● install: compila, empacota e instala no repositório local
● clean: Limpa o projeto
● Muitos outros, inclusive de plugins...
Se você não gosta de linha de comando você pode usar IDEs - Todas IDEs
modernas suportam Maven.
Saída do maven
Maven coloca no console tudo o que está fazendo!
O que eu preciso ter dentro do pom.xml
O mais importante é a informação básica do projeto(ID do artefato, grupo e
versão). Mas também você pode adicionar:
● Dependências (bibliotecas que você pode usar)
○ Quando você declara uma dependência você precisa informar também o id, grupo e versão
dela
○ Cada dependência tem um escopo - já falamos disso
● Plugins
○ Os plugins trazem infinitas possibilidades, mas não falaremos deles aqui hoje
● Gerenciamento de dependências
● Criar perfis de execução
Exemplo de pom.xml
Dependências
Dependências são artefatos que você quer usar. Elas têm versão, grupo e ID e
cada dependência pode ter outras, que são também adicionados ao seu projeto,
mas são chamadas de transitivas (podemos excluir dependências transitivas).
● Uma dependência tem escopo, que é a parte do projeto que ela pode ser
adicionada:
○ test: Só quando rodamos o teste
○ compile: Só para compilação
○ provided: significa que ela já está disponível no lugar onde você vai instalar seu projeto (ex.
servidor de aplicação)
○ Outros: runtime, system e import
● Para listar dependência usamos: mvn dependency:tree
● Todas as dependências são também projetos maven que ficam em um
repositório
Que repositório é esse?
● Todo projeto maven depois de construído será salvo no repositório local ou
pode ser configurado para salvar em um servidor de artefatos maven (Como
o Nexus) - é onde ficam as dependências do projeto também;
● Quase toda biblioteca java está no repositório padrão, o maven central. Você
pode configurar qualquer repositório, por exemplo, colocar os projetos de sua
empresa em um Nexus compartilhado e mapear no arquivo settings.xml
○ settings.xml pode ficar na raiz do projeto (.m2/settings.xml) ou na instalação do Maven
● Quando você instala o maven ele baixa as dependência e salva localmente
(na pasta home do usuário no diretório .m2)
● Quando seu repositório está vazio o maven vai baixar coisa por coisa,
dizemos que ele baixa a internet nesse momento
Principal ferramenta para achar bibliotecas
Mais de 12 milhões de artefatos indexados! Procure no buscador nome da
biblioteca + maven e você vai cair em mvnrepository.com
Plugins
Plugins do Maven são poderosos, eles podem fazer coisas como:
● Subir um servidor no momento dos testes
● Chamar um compilador externo
● Verificar se o seu código segue padrões pré definidos
● Alguns Famosos:
○ maven-war-plugin: para gerar arquivos WAR e configurar a geração dos mesmos
○ assembly: permite configurar a criação do arquivo final
○ exec: para executar arquivos Java
○ …
Archetypes
● Archetypes permitem gerar um projeto básico do maven automaticamente
● Alguma API pode ter um archetype para gerar projetos com a estrutura e
alguns arquivos padrões, assim os usuários não precisam configurar
manualmente
Exemplo mais básico de archetype usando a linha de comando:
1. mvn archetype:generate
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion=1.3
Vantagens do Maven
● Padrão: se você contratar um desenvolvedor no Japão que sabe Maven ele
vai entender seu projeto
● Expansível: Grandes projetos podem usar Maven sem problemas. Exemplo:
os projetos do kiegroup tem mais de 100 mil classes Java e mais de 1500
projetos maven!
○ Embora não explorado na apresentação, o Maven é também ótimo para organizar projetos
hierárquicos com vários módulos
● Flexível: Há plugin para tudo
● Estável: Já é usado há mais de 10 anos
Exemplos
● Gerar projeto com archetype
● Mostrar dependências no repo local
● Mostrar projeto: Tuinter
● Mostrar projeto: SorteaProjeto
● Mostrar Projeto: C4P
● Mostrar projetos do KIE Group
○ Dezenas de desenvolvedores
○ Mais de 100 mil arquivos Java
○ Mais de 1500 projetos Maven.
Dúvidas?
OBRIGADO!

Maven: Introdução

  • 1.
  • 2.
    AVISO “Este é umaapresentação pessoal. As opiniões aqui expressadas são de única responsabilidade minha, e nada referem-se às da empresa para qual trabalho.”
  • 3.
    ● Programa háquase 10 anos ● Software Engineer @ Red Hat ● FATEC SJC - UFABC ● Dados Abertos (SJC Digital - sjcdigital.com) ● JUG Vale Sobre William Antônio Siqueira
  • 4.
    Objetivo Hoje nós vamos: -Entender a importância da ferramenta Maven e a motivação para sua existência - Passar pelos principais conceitos - Mostrar aplicações com maven - Uma super básica, o TUINTER - Uma aplicação pequena: o SorteiaAPP - Uma média, o Call4Papers - Uma aplicação avançada: o jBPM
  • 5.
    Maven Ferramenta da ApacheFoundation para gerenciamento de projetos - Padroniza estrutura de projetos - Controla ciclos de execução (rodar, construir, testar, etc) - Facilita gerenciamento de bibliotecas usadas pelo projeto - Pode fazer praticamente tudo através de plugin
  • 6.
  • 7.
    Vamos fazer umprojeto Você tem uma grande ideia de um projeto que vai mudar o mundo O projeto vai fazer um monte de coisa como salvar informações, acessar redes sociais e minerar bitcoin… é um projeto grande
  • 8.
    Ninguém desenvolve nadasozinho Para realizar o seu projeto você pesquisa na internet bibliotecas e descobre algumas que vão te ajudar: JSalvaCoisas, JRedesSociais e JBitcoin. Rapidamente no seu computador você baixa cada uma delas e usa em seu projeto. Por exemplo, um projeto do Eclipse. Passado uns meses, um colega toma conhecimento, ele se dispõe a ajudar a criar uma nova funcionalidade. Você manda pra ele o projeto do Eclipse
  • 9.
    Tá tudo estranho Oque era pra ser uma ajuda vira uma dor de cabeça! AO importar o projeto um monte de erro aparece, seu amigo não consegue ajudar. Após um tempo de sofrimento você lembra que seu amigo também precisa das bibliotecas: JSalvaCoisas, JRedesSociais e JBitcoin. Ele corre e baixa, muitos erros são resolvidos, mas ainda sim seu amigo não consegue resolver nada!
  • 10.
    As coisas mudam... Muitotempo depois vocês descobrem que seu amigo baixou outra versão das bibliotecas JSalvaCoisas, JRedesSociais e JBitcoin que já tinham sido atualizadas e seu código na verdade usava uma versão antiga, você nem fazia ideia! Após descobrir a versão e achar ela na internet, seu amigo consegue finalmente ajudar você, adiciona imagens legais ao projeto e ele manda pra você de novo o projeto do Eclipse.
  • 11.
    Organizando as coisas Chegapra você o projeto, ele roda localmente. Você nota que seu amigo colocou no meio do código imagens espalhadas, junto com arquivos Java, você então cria um diretório só para imagens e coloca lá, então comunica seu amigo onde ficam as imagens, na pasta “imagens” agora. Também faz uma estrutura para o projeto. Você e seu colega se entendem e conseguem juntos rodar o projeto
  • 12.
    Nem todo mundousa o que você usa! O projeto é um sucesso e com o crescimento novas pessoas começam a trabalhar com vocês. Logo você descobre que nem todo mundo usa Eclipse e por isso cria “scripts” que vão compilar os arquivos Java e executar o projeto sem depender do Eclipse. Você usa Windows, no entanto, alguns usuários de Linux querem ajudar no projeto, e você vai precisar de arquivos shell para executar no linux, você está com energia, cria todos os arquivos para todo mundo. Sua equipe de 5 pessoas consegue trabalhar juntos, sucesso!
  • 13.
    Projetos crescem, abagunça também Agora você usa dezenas de bibliotecas de diversas versões. Para resolver isso cria uma pasta compartilhada com todos os arquivos .jar que todo mundo pode pegar em algum lugar nas nuvens. Depois de um tempo você nota que alguns arquivos .jar estão duplicados, pois as bibliotecas que você usa também podem ser usadas por outras pessoas. Alguns inclusive são duplicados em outros sub-projetos! O negócio fica pior quando há erros estranhos durante a execução do projeto como: ClassNotFoundException, ClassCastException (problemas que acontecem por causa de conflitos de classes carregadas)
  • 14.
    Trocar pessoas emum projeto pode não ser fácil Sua equipe cresceu, algumas pessoas saem do projeto, não querem mais, você precisa de novos contribuidores e a cada novo contribuidor você precisa que ele baixe aquele monte de jar repetido, arrume scripts para rodar no computador dele, entenda a estrutura do projeto… Tempo perdido e desgastante.
  • 15.
    O seu projetovira um fardo Depois de meses, cheio de JARs, scripts malucos e falta de padrão, hoje seu projeto é um fardo, bagunçado, ninguém entende e você não sabe mais o que fazer… Vamos ver como muitos desses problemas (e muitos outros que não citamos aqui) poderiam ter sido resolvidos com Maven!
  • 16.
    Configuração e estruturaPadronizada com Maven Quando um projeto é criado utilizando Maven a estrutura e a configuração é padronizada. Toda configuração acontece em um arquivo chamado pom.xml que fica na raiz do projeto. Só isso já resolve muito problema
  • 17.
    Configuração e estruturaPadronizada com Maven - Na raiz do projeto sempre terá um pom.xml - Em src é onde colocamos o código da aplicação: - src/main/java: Código Java - src/main/resources: arquivos que podem ser lidos, mas não são .java - src/test/java: Código de testes com Java - src/test/resources: Arquivos que que podem ser lidos durante o teste - Quando o projeto é construído os arquivos vão para um diretório chamado target
  • 18.
    Execução e construçãodo projeto com Maven O comando para executar o maven é mvn. Você usa esse comando passando para o maven o que você quer fazer, o ciclo, podendo chamar um após outro. Alguns ciclos: ● compile: compila ● package: Empacota o projeto (cria um JAR, WAR, etc) ● install: compila, empacota e instala no repositório local ● clean: Limpa o projeto ● Muitos outros, inclusive de plugins... Se você não gosta de linha de comando você pode usar IDEs - Todas IDEs modernas suportam Maven.
  • 19.
    Saída do maven Mavencoloca no console tudo o que está fazendo!
  • 20.
    O que eupreciso ter dentro do pom.xml O mais importante é a informação básica do projeto(ID do artefato, grupo e versão). Mas também você pode adicionar: ● Dependências (bibliotecas que você pode usar) ○ Quando você declara uma dependência você precisa informar também o id, grupo e versão dela ○ Cada dependência tem um escopo - já falamos disso ● Plugins ○ Os plugins trazem infinitas possibilidades, mas não falaremos deles aqui hoje ● Gerenciamento de dependências ● Criar perfis de execução
  • 21.
  • 22.
    Dependências Dependências são artefatosque você quer usar. Elas têm versão, grupo e ID e cada dependência pode ter outras, que são também adicionados ao seu projeto, mas são chamadas de transitivas (podemos excluir dependências transitivas). ● Uma dependência tem escopo, que é a parte do projeto que ela pode ser adicionada: ○ test: Só quando rodamos o teste ○ compile: Só para compilação ○ provided: significa que ela já está disponível no lugar onde você vai instalar seu projeto (ex. servidor de aplicação) ○ Outros: runtime, system e import ● Para listar dependência usamos: mvn dependency:tree ● Todas as dependências são também projetos maven que ficam em um repositório
  • 23.
    Que repositório éesse? ● Todo projeto maven depois de construído será salvo no repositório local ou pode ser configurado para salvar em um servidor de artefatos maven (Como o Nexus) - é onde ficam as dependências do projeto também; ● Quase toda biblioteca java está no repositório padrão, o maven central. Você pode configurar qualquer repositório, por exemplo, colocar os projetos de sua empresa em um Nexus compartilhado e mapear no arquivo settings.xml ○ settings.xml pode ficar na raiz do projeto (.m2/settings.xml) ou na instalação do Maven ● Quando você instala o maven ele baixa as dependência e salva localmente (na pasta home do usuário no diretório .m2) ● Quando seu repositório está vazio o maven vai baixar coisa por coisa, dizemos que ele baixa a internet nesse momento
  • 24.
    Principal ferramenta paraachar bibliotecas Mais de 12 milhões de artefatos indexados! Procure no buscador nome da biblioteca + maven e você vai cair em mvnrepository.com
  • 25.
    Plugins Plugins do Mavensão poderosos, eles podem fazer coisas como: ● Subir um servidor no momento dos testes ● Chamar um compilador externo ● Verificar se o seu código segue padrões pré definidos ● Alguns Famosos: ○ maven-war-plugin: para gerar arquivos WAR e configurar a geração dos mesmos ○ assembly: permite configurar a criação do arquivo final ○ exec: para executar arquivos Java ○ …
  • 26.
    Archetypes ● Archetypes permitemgerar um projeto básico do maven automaticamente ● Alguma API pode ter um archetype para gerar projetos com a estrutura e alguns arquivos padrões, assim os usuários não precisam configurar manualmente Exemplo mais básico de archetype usando a linha de comando: 1. mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.3
  • 27.
    Vantagens do Maven ●Padrão: se você contratar um desenvolvedor no Japão que sabe Maven ele vai entender seu projeto ● Expansível: Grandes projetos podem usar Maven sem problemas. Exemplo: os projetos do kiegroup tem mais de 100 mil classes Java e mais de 1500 projetos maven! ○ Embora não explorado na apresentação, o Maven é também ótimo para organizar projetos hierárquicos com vários módulos ● Flexível: Há plugin para tudo ● Estável: Já é usado há mais de 10 anos
  • 28.
    Exemplos ● Gerar projetocom archetype ● Mostrar dependências no repo local ● Mostrar projeto: Tuinter ● Mostrar projeto: SorteaProjeto ● Mostrar Projeto: C4P ● Mostrar projetos do KIE Group ○ Dezenas de desenvolvedores ○ Mais de 100 mil arquivos Java ○ Mais de 1500 projetos Maven.
  • 29.