Apache Maven

Simplificando a construção de projetos

LPOO 2 - Java


Prof. Rodrigo Noll @ IFRS Canoas



Versão para impressão

O que é Apache Maven?



Apache Maven

“Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.”
https://maven.apache.org/

1. Apache Maven

  • Uma ferramenta de gerenciamento de projetos
  • Fornece um sistema de gerenciamento de dependências
  • Estabelece um conjunto de padrões e ciclo de vida de projeto
  • Lógica para execução dos objetivos dos plugins durante as fases do ciclo de vida do projeto

2. Apache Maven

  • Usado para montar (build) projetos:
    • Compilar
    • Executar Testes
    • Empacotar Jar/War
    • Implantar no servidor

3. Apache Maven

    Considera a Convenção sobre Configuração:

  • Exemplo de projeto:
    • src/main/java
    • src/main/resources
    • src/test/java
    • src/test/resources
  • Com plugins como mvn install, é possível:
    • compilar, executar, empacotar e implantar

4. Apache Maven

  • Oferece Arquétipos (templates) para criação de projetos:
    • standalone, webapp, ear, war, jar

  • Que rodam naturalmente em diversas IDEs:
    • Eclipse, IntelliJ, NetBeans, etc.

5. Apache Maven

Por que usar?

  • O projeto segue uma estrutura consistente (convenção sobre configuração)

  • O projeto é agnóstico de IDE
    • Antes cada projeto rodava em IDEs específicas
    • Possuia formas particulares de montar o projeto (ordem de compilação e dependência de bibliotecas, por exemplo)
    • Demandava muito tempo e era propenso a erro

6. Apache Maven

Por que usar?

  • Gerenciamento das dependências (bibliotecas) externas ao projeto

  • Ao adicionar uma dependência, o maven install:
    1. Verifica se está a mesma está no repositório local
      • senão está, baixa do repositório remoto
    2. Referencia a mesma ao projeto (não a copia para dentro)

7. Apache Maven

Por que usar?

  • Permite modificações simples no projeto (único arquivo de configuração)
  • Reuso através de plugins: compiler, surefire, wsimport
  • Simplifica a declaração de dependências do projeto (repositórios)
  • Utiliza um arquivo Project Object Model (pom.xml)

Instalação

Instalação

Não é necessário instalação manual usando IDEs

Integração com IDEs

  • Eclipse
  • NetBeans
  • IntelliJ

Integração com Eclipse

  • Suporte completo para Maven
  • Inclui um navegador nos repositório
  • Pode ser utilizado para criar Projetos Maven
  • Apoia o gerenciamento de dependências
  • Realiza download automático das dependências necessárias
  • Permite a criação e importação de projetos
  • Fornece apoio completo a edição de arquivos pom.xml

Eclipse Web Tools Platform

Eclipse Web Tools Platform

Project Object Model

pom.xml

POM: Project Object Model

POM significa Project Object Model. Este modelo tem um conjunto de padrões, um ciclo de vida de projeto, um sistema de gerenciamento de dependência e a lógica para executar os objetivos do plugin em fases específicas do ciclo de vida.

POM: Project Object Model

  • Projetos são organizados com comportamentos padrões
  • Código fonte deve estar na pasta src/main
  • Os recursos necessários para o projeto estão em outra pasta
  • Os casos de teste estão em uma pasta especifica
  • A pasta target é usada para o JAR do projeto

POM: Estrutura de Pastas

Convenção sobre Configuração: usando sempre uma estrutura padrão de pastas, faz com que desenvolvedores se concentrem em codificar, deixando o maven fazer o resto

POM: Project Object Model

pom.xml inclui:

  • Descrição do projeto
  • Autores e colaboradores do programa
  • Licença do projeto
  • Propriedades do projeto
  • Dependências

POM: Project Object Model

pom.xml responsável por:

  • Gerenciamento de dependências
  • Repositórios remotos
  • Reuso universal da lógica de construção
  • Portabilidade e integração de ferramentas
  • Facilidade na busca e filtro de artefatos do projeto

Sintaxe do POM

  • O POM é documentado em um arquivo XML
  • O arquivo é armazenado na base do diretório do projeto
  • A sintaxe é similar a um arquivo HTML, usando tags <>
  • A declaração XML é opcional
  • Todos os projetos estendem o super POM automaticamente

pom.xml


<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>br.edu.ifrs.canoas.lpoo2</groupId>
  <artifactId>maven</artifactId>
  <version>0.1</version>
  <description>Este programa mostra o funcionamento básico do maven.
  </description>
  <packaging>jar</packaging>

  <name>maven</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
                            

Coordenadas do POM

  • O POM contém toda a informação sobre o projeto
  • 
    <project>
      <groupId>br.edu.ifrs.canoas.lpoo2</groupId>
      <artifactId>maven</artifactId>
      <version>0.1</version>
      <packaging>jar</packaging>
    </project>
                                
    Os itens acima representam as coordenadas necessárias ao maven para todos os projetos. Onde groupId:artifactId:packaging:version: definem o local e o nome do projeto no repositório do maven.

Coordenadas do POM

Coordenadas necessárias para todos projetos:

  • groupId: com.oracle, org.apache, br.edu.ifrs.canoas
  • artifactId: nome do projeto, como helloworld, junit
  • version: helloworld-1.0-SNAPSHOT.jar, helloworld-1.0.jar
  • packaging: jar, war

Plugins e Objetivos/Goals

Plugins e Goals

Plugin é como tudo funciona no Maven, cada plugin é um framework de execução composto por uma coleção de goals.
ex.: archetype:generate, install:install


Goal pode ser uma tarefa específica ou parte de um build maior. Podem receber parâmetros e ter valores padrões para estes parâmetros.
ex.: compile, test, package

Plugins/Goals

  • Um projeto isolado do Maven não sabe como criar, compilar, testar, empacotar arquivos.

  • Essas definições vem de Plugins herdados de um modelo padrão (super POM), no qual cada projeto pode redefini-las
  • Plugins do Maven

    Alguns core plugins do Maven são:

    • JAR: que cria o JAR (Java Archive file)
    • Compiler: contém os objetivos para compilar o código fonte e testes de unidade
    • Surefire: usados para executar testes de unidade e gerar relatórios

    Maven permite que outros plugins possam ser criados (java, ant, grovie, etc.)

    Plugins do Maven

    Plugins do Maven

    Para executar um plugin:
    mvn compiler:compile

    Plugins do Maven no Eclipse

    Para executar um plugin: clique com o botão direito sobre o Projeto Maven > Run As...

    Ciclo de Vida do Maven

    Ciclo de vida de um Projeto

    1. Gerar um projeto: pom.xml + código fonte
    2. Executar Maven em uma fase do ciclo de vida (argumento) para executar os objetivos da fase
    3. Instalar o artefato do Maven no seu repositório
    4. Executar a aplicação

    Fases do Ciclo de Vida

    • Validate: validar o projeto para ter certeza que ele está correto e toda a informação necessária está disponível
    • Compile: compilar o código fonte do projeto
    • Test: compilar o código fonte usando uma API de testes
    • Package: pegar o código compilado em empacota em seu formato de distribuição (war, ear, jar, etc.)

    Fases do Ciclo de Vida

    • Integration Test: implantar o pacote em um ambiente onde testes de integração possam rodar
    • Verify: verificar se o pacote é válido
    • Install: instalar o pacote no repositório local
    • Deploy: copiar o pacote final no repositório remoto

    Fases do Ciclo de Vida

    • Objetivos do plugin podem ser adicionados a cada fase do ciclo de vida
    • Maven executa apenas os objetivos adicionados a cada uma das fases
    • Cada fase tem zero ou mais objetivos a serem atingidos
    • Por exemplo, quando se executa mvn install, múltiplos objetivos são executados
    • Na fase de Package, Maven executa o objetivo JAR

    Fases do ciclo de vida

    Exemplo:mvn install

    Execução das fases do ciclo de vida

    1. process-resources
    2. compile
    3. test
    4. package

    Fases do Ciclo de Vida

    mvn install

    
    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building maven 0.1
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/src/main/resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/target/classes
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/src/test/resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/target/test-classes
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven ---
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-booter/2.12.4/surefire-booter-2.12.4.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-booter/2.12.4/surefire-booter-2.12.4.pom (3 KB at 1.2 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-api/2.12.4/surefire-api-2.12.4.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-api/2.12.4/surefire-api-2.12.4.pom (3 KB at 7.3 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/maven-surefire-common/2.12.4/maven-surefire-common-2.12.4.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/maven-surefire-common/2.12.4/maven-surefire-common-2.12.4.pom (6 KB at 14.7 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugin-tools/maven-plugin-annotations/3.1/maven-plugin-annotations-3.1.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugin-tools/maven-plugin-annotations/3.1/maven-plugin-annotations-3.1.pom (2 KB at 4.8 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugin-tools/maven-plugin-tools/3.1/maven-plugin-tools-3.1.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugin-tools/maven-plugin-tools/3.1/maven-plugin-tools-3.1.pom (16 KB at 32.2 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.pom (2 KB at 5.2 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting/2.0.9/maven-reporting-2.0.9.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting/2.0.9/maven-reporting-2.0.9.pom (2 KB at 4.2 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-toolchain/2.0.9/maven-toolchain-2.0.9.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-toolchain/2.0.9/maven-toolchain-2.0.9.pom (4 KB at 10.3 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-common-artifact-filters/1.3/maven-common-artifact-filters-1.3.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-common-artifact-filters/1.3/maven-common-artifact-filters-1.3.pom (4 KB at 10.3 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-components/12/maven-shared-components-12.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-components/12/maven-shared-components-12.pom (10 KB at 25.8 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/13/maven-parent-13.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/13/maven-parent-13.pom (23 KB at 56.2 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-booter/2.12.4/surefire-booter-2.12.4.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-booter/2.12.4/surefire-booter-2.12.4.jar (34 KB at 81.0 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-api/2.12.4/surefire-api-2.12.4.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-api/2.12.4/surefire-api-2.12.4.jar (115 KB at 161.3 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/maven-surefire-common/2.12.4/maven-surefire-common-2.12.4.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/maven-surefire-common/2.12.4/maven-surefire-common-2.12.4.jar (257 KB at 260.4 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-common-artifact-filters/1.3/maven-common-artifact-filters-1.3.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-common-artifact-filters/1.3/maven-common-artifact-filters-1.3.jar (31 KB at 75.5 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.8/plexus-utils-3.0.8.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.8/plexus-utils-3.0.8.jar (227 KB at 275.7 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.jar (10 KB at 28.9 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-toolchain/2.0.9/maven-toolchain-2.0.9.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-toolchain/2.0.9/maven-toolchain-2.0.9.jar (38 KB at 96.1 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugin-tools/maven-plugin-annotations/3.1/maven-plugin-annotations-3.1.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugin-tools/maven-plugin-annotations/3.1/maven-plugin-annotations-3.1.jar (14 KB at 38.5 KB/sec)
    [INFO] Surefire report directory: /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/target/surefire-reports
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.pom (2 KB at 5.1 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-providers/2.12.4/surefire-providers-2.12.4.pom
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-providers/2.12.4/surefire-providers-2.12.4.pom (3 KB at 6.6 KB/sec)
    [INFO] Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.jar
    [INFO] Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.jar (26 KB at 68.4 KB/sec)
    
    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running br.edu.ifrs.canoas.lpoo2.maven.AppTest
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
    
    Results :
    
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    
    [INFO]
    [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven ---
    [INFO] Building jar: /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/target/maven-0.1.jar
    [INFO] META-INF/maven/br.edu.ifrs.canoas.lpoo2/maven/pom.xml already added, skipping
    [INFO] META-INF/maven/br.edu.ifrs.canoas.lpoo2/maven/pom.properties already added, skipping
    [INFO]
    [INFO] --- maven-install-plugin:2.4:install (default-install) @ maven ---
    [INFO] Installing /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/target/maven-0.1.jar to /Users/rodrigo/.m2/repository/br/edu/ifrs/canoas/lpoo2/maven/0.1/maven-0.1.jar
    [INFO] Installing /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/pom.xml to /Users/rodrigo/.m2/repository/br/edu/ifrs/canoas/lpoo2/maven/0.1/maven-0.1.pom
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 15.941 s
    [INFO] Finished at: 2017-06-30T14:48:47-03:00
    [INFO] Final Memory: 18M/164M
    [INFO] ------------------------------------------------------------------------
    
        					
    • maven-resources-plugin:2.6:resources
    • maven-compiler-plugin:3.1:compile
    • maven-compiler-plugin:2.6:testResources
    • maven-compiler-plugin:3.1:testCompile
    • maven-compiler-plugin:2.12.4:test
      • Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
    • maven-compiler-plugin:2.4:jar
      • Building jar: /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/target/maven-0.1.jar
    • maven-install-plugin:2.4:install
      • [INFO] Installing /Users/rodrigo/Development/eclipseProjects/ws-2017/maven/target/maven-0.1.jar to /Users/rodrigo/.m2/repository/br/edu/ifrs/canoas/lpoo2/maven/0.1/maven-0.1.jar

    Repositórios do Maven

    Repositórios do Maven

    • Repositório central: contém os componentes de código livre disponíveis

    • Repositório local: criado pelo Maven localmente, baixados conforme demanda na pasta do computador em ~/.m2 (jar + pom.xml de cada biblioteca).

    Repositório Central

    Onde os arquivos estão

    Repositório Central

    Como recuperar a referência

    http://search.maven.org/

    Repositório Central

    Como recuperar a referência

    Dependências

    • Permite o reuso de código quando referenciado na seção de dependências
      • Parecido com o que acontece em Java quando reusamos APIs como JavaIO, Math, etc.
    • Copia conforme demanda as bibliotecas do repositório central para o local
    • Permite que o projeto Maven utilize as bibliotecas do repositório local (não as copia para dentro o projeto)
    • Todas as dependências são definidas dentro dentro das coordenadas do pom.xml: groupId, artifactId e version

    Dependências

    Copiando a dependência no POM do projeto

    
    [...]
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    [...]
                                

    Repositório Local

    Arquivos copiados do repositório central para o local (máquina do desenvolvedor)

    Pasta ~/.m2 do computador.

    Repositório Local

    Os projetos Maven desenvolvidos também são incluídos no repositório local

    Pasta ~/.m2 do computador.

    Repositório Coorporativo

    Se algum produto não estiver disponível no repositório central, pode-se criar um coorporativo que espelha o central e adiciona os produtos faltantes

    Continuando... Dependências

    • Maven suporta dependências externas e internas
    • Adicione dependências com a tag <dependency>
    • Dependências podem ser do JUnit, log4j, etc.
    
    <project>
      [...]
      <dependencies>
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.14</version>
        </dependency>
        <dependency>
          <groupId>jaxen</groupId>
          <artifactId>jaxen</artifactId>
          <version>1.1.1</version>
        </dependency>
      </dependencies>
      [...]
    </project>
                                

    Notem que a tag de escopo não está definida para estas duas. Se não está definido, o padrão é a fase compile

    Dependências

    • A dependência do JUnit requer a tag de escopo de teste
    • <scope>test</scope>
    • Outros escopos incluem:
      • compile: padrão, durante a compilação do projeto
      • provided: quando é esperado que o JDK forneça
      • runtime: para execução e teste do projeto, não para compilação
      • test: quando a dependência não é necessária durante a operação normal do projeto, mas apenas durante a execução dos testes
      • system: é para se especificar o local do JAR dentro de uma pasta do sistema de arquivos do computador/servidor

    Effective POM

    Effective Pom: união do POM do projeto (Simplest POM) e suas dependências/heranças, incluindo do Super POM

    Melhores Práticas para POM

    Melhores Práticas

    • Agrupar dependências comuns
    • Podem ser utilizados arquivos POM separados que simplesmente declaram um conjunto dependências comuns
      • ex.: projetos do Spring Data, que declaram dependências comuns para hibernate
    • Permitir que outros projetos utilizem este POM

    Melhores Práticas

    • Escolher entre:
      • Herança: usado quando projetos compartilham dependências
      • Módulos multiplos: usado quando componentes não se relacionam, mas são necessários para um projeto maior
    • Identação adequada do arquivo pom.xml
    • Seguir um estilo padrão onde as coordenadas são listadas primeiro

    Maven e Eclipse

    Maven e Eclipse

    Iremos discutir:

    1. Caso de uso
    2. Criando Projeto Maven no Eclipse
    3. Implementando camadas de dados e negócios
    4. Adicionar dependências

    Maven e Eclipse

    Caso de Uso

    Caso de Uso

    Aplicação Web para gerenciar produtos:


    • Funcionalidades:
      • criação
      • apresentação

    • Camadas:
      • Dados - (DTO - Data Transfer Object)
      • Persistência (DAO - Data Access Object)
      • Negócio (Business) - (BO - Business Object)

    Maven e Eclipse

    Criando Projeto Maven no Eclipse

    Criando Projeto Maven no Eclipse

    Criando Projeto Maven no Eclipse

    Criando Projeto Maven no Eclipse

    Criando Projeto Maven no Eclipse

    Criando Projeto Maven no Eclipse

    Criando Projeto Maven no Eclipse

    Copie o código abaixo após a declaração de dependências:

    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
                            

    Como podem ver, tudo no Maven é configurado via plugins

    Criando Projeto Maven no Eclipse

    Para recompilar o projeto em Java 8, conforme redefinição do JDK

    Maven e Eclipse

    Implementando camada de dados

    Implementando camada de dados

    1. Exclua as classes geradas pelo plugin.

    Implementando camada de dados

    2. Criando DTO (Data Transfer Objetct)

    Crie uma nova classe br.edu.ifrs.canoas.jee.maven.dto.Product em em src/main/java Adicione os atributos id (int), name (String), description (String) e price (double)

    Implementando camada de dados

    2. Criando DTO (Data Transfer Objetct)

    br.edu.ifrs.canoas.jee.maven.dto.Product
    
    package br.edu.ifrs.canoas.jee.maven.dto;
    
    public class Product {
    	private int id;
    	private String name;
    	private String description;
    	private double price;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getDescription() {
    		return description;
    	}
    	public void setDescription(String description) {
    		this.description = description;
    	}
    	public double getPrice() {
    		return price;
    	}
    	public void setPrice(double price) {
    		this.price = price;
    	}
    }
                            

    Implementando camada de dados

    3. Criando Interface DAO (Data Access Object)

    a) Adicione os métodos CRUD na interface: br.edu.ifrs.canoas.jee.maven.dao.ProductDAO

    • void create(Product product);
    • Product retrieve (int id);
    • void update(Product product);
    • void delete (int id);

    Implementando camada de dados

    3. Criando Interface DAO (Data Access Object)

    br.edu.ifrs.canoas.jee.maven.dao.ProductDAO
    
    package br.edu.ifrs.canoas.jee.maven.dao;
    
    import br.edu.ifrs.canoas.jee.maven.dto.Product;
    
    public interface ProductDAO {
    
    	void create(Product product);
    	Product retrieve (int id);
    	void update(Product product);
    	void delete (int id);
    
    }                        

    Implementando camada de dados

    4. Implementando DAO (Data Access Object)

    Implemente a interface ProductDAO em br.edu.ifrs.canoas.jee.maven.dao.ProductDAOImpl.

    • Use um Map<Integer,Product> para simular o banco de dados

    Implementando camada de dados

    4. Implementando DAO (Data Access Object)

    br.edu.ifrs.canoas.jee.maven.dao.ProductDAOImpl
    
    package br.edu.ifrs.canoas.jee.maven.dao;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import br.edu.ifrs.canoas.jee.maven.dto.Product;
    
    public class ProductDAOImpl implements ProductDAO{
    
    	private Map <Integer, Product> products = new HashMap<>();
    
    	@Override
    	public void create(Product product) {
    		products.put(product.getId(), product);
    
    	}
    
    	@Override
    	public Product retrieve(int id) {
    		return products.get(id);
    	}
    
    	@Override
    	public void update(Product product) {
    		products.replace(product.getId(), product);
    
    	}
    
    	@Override
    	public void delete(int id) {
    		products.remove(id);
    	}
    
    }
                           

    Maven e Eclipse

    Testes de Unidade

    Testes de Unidade

    1. Atualizando a versão do JUnit

    Visite MVN Repository e procure a última versão do JUnit

    Atualize o pom.xml com esta dependência e depois Update Project

    Testes de Unidade

    1. Atualizando a versão do JUnit

    Adicione agora a dependência da biblioteca assertj-core e hamcrest-all. Atualize novamente o projeto.

    Testes de Unidade

    2. Escrevendo Testes de Unidade

    Botão direito em cima da classe ProductDAOImpl > New > Other

    Testes de Unidade

    2. Escrevendo Testes de Unidade

    Selecione JUnit Test Case.
    Na próxima tela, mude o Source Folder para src/test/java. Use demais configurações padrões.

    Testes de Unidade

    2. Escrevendo Testes de Unidade

    Implementando camada de dados

    2. Escrevendo Testes de Unidade

    br.edu.ifrs.canoas.jee.maven.dao.ProductDAOImplTest
    
    package br.edu.ifrs.canoas.jee.maven.dao;
    
    import static org.assertj.core.api.Assertions.*;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import br.edu.ifrs.canoas.jee.maven.dto.Product;
    
    public class ProductDAOImplTest {
    
    	private ProductDAO dao;
    
    	@Before
    	public void setup(){
    		dao = new ProductDAOImpl();
    	}
    
    	@Test
    	public void testCreateShouldCreateAProduct() {
    		Product product = this.getProduct();
    
    		//Busca o produto pelo Id
    		Product retrievedProduct = dao.retrieve(product.getId());
    
    		//Verifica que não existe o produto na camada de persistência
    		assertThat(retrievedProduct).isNull();
    
    		//Cria um novo produto
    		dao.create(product);
    
    		//Busca o produto pelo Id novamente
    		retrievedProduct = dao.retrieve(product.getId());
    
    		//Verifica que o produto de nome Phone agora existe.
    		assertThat(retrievedProduct.getName()).isEqualTo("Phone");
    	}
    
     	private Product getProduct(){
    		Product product = new Product();
    		product.setId(1);
    		product.setName("Phone");
    		product.setDescription("Awesome product!");
    		product.setPrice(100.2f);
    		return product;
    	}
    
    }
    
                           

    Testes de Unidade

    3. Rodar JUnit

    Para executar os testes, botão direito sobre o nome do projeto > Run As > Maven Install Observe os resultados na saída da console

    Testes de Unidade

    4. Pular Testes

    a) Verifique o que acontece se uma asserção falhar. Para pular o teste no Eclipse:

    Testes de Unidade

    4. Pular Testes

    b) Para pular o teste no Eclipse:

    Defina: Name (qualquer), Base Directory (selecione do workspace), Goal (install) e marque o checkbox 'Skip Tests'

    EXERCÍCIOS


    Implemente a estrutura abaixo e realize os testes dos demais métodos das classes.

    Apache Maven

    Exercícios


    LPOO 2 - Java