Templates de projeto customizados com Apache Maven

O Apache Maven é uma ferramenta open source para automatização de tarefas bastante popular principalmente para desenvolvedores java. A ferramenta já foi citada várias vezes aqui no blog da MATERA.

Nesse post vou falar sobre uma funcionalidade muito utilizada e que facilita muito a criação de projetos, os archetypes, e ensinar como criar seu próprio archetype.

Um archetype é um template para criação da estrutura de um projeto, ou seja, através de um modelo, o maven pode criar pastas, subpastas, arquivos e até dependências com um único comando. Vamos tentar?

1° Passo

Considerando que você já tenha o maven instalado e configurado (caso ainda não tenha instalado, dê uma olhadinha nesse post), abra um console ou um shell script (estou usando o windows, mas os comandos funcionam igualmente no linux. Estou usando o maven versão 3.2.5) e navegue até um diretório de sua preferência.

2° Passo

Digite o comando:

mvn archetype:generate -DgroupId=com.mycompany -DartifactId=helloArchetypes -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

O que aconteceu?

Utilizamos o plugin “archetype” e o goal “generate” para criar um novo projeto utilizando um template pré-existente para aplicações web (maven-archetype-webapp). Utilizamos também o atributo “groupId” para definir o grupo de nossa empresa fictícia e o “artifactId” para o identificador do nosso projeto. O parâmetro “interactiveMode=false” indica que não queremos que o maven solicite informações sobre o projeto e apenas utilize os valores default.

O comando gerou a seguinte estrutura de diretórios (figura 1):

estruturaDiretorio

Figura 1 – Estrutura de diretórios

O maven já oferece alguns archetypes pré configurados que estão disponíveis aqui. Existem também outros archetypes de terceiros. O catálogo completo pode ser consultado aqui (em xml).

Agora que você já criou um projeto com um template existente, vamos alterar a estrutura do projeto e criar nosso próprio archetype (que era o objetivo desse post, lembra?).

3° Passo

Altere a estrutura do projeto, criando novos diretórios. Meu projeto ficou assim (figura 2):

novaEstrutura

Figura 2 – Alterando a estrutura original

Criei três novas pastas (pages, scripts e styles) dentro de webapp e movi o arquivo index.jsp para dentro de pages.

4° Passo

Agora que o projeto já está com a estrutura base montada, navegue até a raiz do projeto e rode o comando:

mvn archetype:create-from-project

O maven gerou o esqueleto do seu archetype no diretório helloArchetypes/target/generated-sources/archetype. Copie o conteúdo da pasta archetype para outro diretório qualquer e remova a pasta target existente dentro da pasta archetype.

5° Passo

Altere o pom.xml que fica em archetype/src/main/resources/archetype-resources. Substitua o nome do projeto (dentro da tag <name>) pela variável ${artifactId}. Isso fará com que o maven substitua o artifactId pelo valor informado no momento em que utilizarmos esse archetype para gerar um novo projeto. Mude também a tag <finalName>, caso exista.

O maven não mapeia automaticamente pastas sem conteúdo, e isso nos causará problemas, pois criei duas pastas vazias dentro de webapp, scripts e styles. Temos duas soluções para isso, criar arquivos vazios dentro desses diretórios ou editar um arquivo dentro do archetype. Vamos para a segunda opção?

Localize dentro do seu archetype o arquivo archetype/src/main/resources/META-INF/maven/archetype-metadata.xml. Abra-o com um editor de textos qualquer. Perceba que existem algumas informações sobre a estrutura do projeto dentro desse arquivo. Pois é, é daí que o maven identifica como deve montar o projeto quando esse archetype é utilizado. Vamos incluir nossos diretórios vazios incluindo duas novas tags fileSet dentro da tag fileSets. Meu arquivo ficou assim:

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd" name="helloArchetypes"
    xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <fileSets>
    <fileSet filtered="true" encoding="UTF-8">
      <directory>src/main/webapp</directory>
      <includes>
        <include>**/*.jsp</include>
        <include>**/*.xml</include>
      </includes>
    </fileSet>
    <fileSet filtered="true" encoding="UTF-8">
      <directory>src/main/webapp/scripts</directory>
    </fileSet>
    <fileSet filtered="true" encoding="UTF-8">
      <directory>src/main/webapp/styles</directory>
    </fileSet>
  </fileSets>
</archetype-descriptor>

6° Passo

Rode o comando mvn clean install na raiz do seu archetype. Se a sua build rodou com sucesso, parabéns, seu primeiro archetype está criado.

7º Passo

Para gerar um novo projeto utilizando como base seu archetype personalizado, rode o comando:

mvn archetype:generate -DarchetypeCatalog=local -DgroupId=com.mycompany -DartifactId=helloMyArchetype 
-DinteractiveMode=false -DarchetypeGroupId=com.mycompany -DarchetypeArtifactId=helloArchetypes-archetype

Perceba que houve algumas diferenças com relação ao comando generate utilizando um archetype pré existente. Primeiro, informamos ao maven que utilizaremos um catálogo local, através do parâmetro -DarchetypeCatalog=local. Tivemos também que informar qual era o groupId do archetype através do parâmetro -DarchetypeGroupId. Caso você não queira informar o archetypeId e o archetypeArtifactId, pode remover o parâmetro -DinteractiveMode=false para que o maven exiba as opções do catálogo local e você possa escolher através de números.

Meu projeto novo ficou assim (figura 3):

novoProjeto

Figura 3 – Estrutura do novo projeto

Deu certo!! O maven criou um projeto com a mesma estrutura do meu projeto base.

Algumas observações finais:

  • O catálogo local do maven fica em .m2/archetype-catalog.xml. Se quiser remover os archetypes locais, basta editar esse arquivo ou mesmo removê-lo.
  • Você pode também definir parâmetros personalizados que serão passados para o archetype no momento de gerar o projeto, mas para isso, será necessário criar um arquivo .properties e informá-lo no momento de gerar o archetype. Ex: mvn archetype:create-from-project -Darchetype.properties=argumentos.properties. Para utilizar os parâmetros no momento de criar um novo projeto, informe-os ao executar o método generate. Ex: mvn archetype:generate -DarchetypeCatalog=local -DmeuParametro=valor.
  • O maven possui um catálogo imenso de archetypes já existentes. Verifique se não existe um que atenda a sua necessidade. Seguir um padrão já existente e conhecido pela comunidade é sempre melhor do que criar algo próprio que só você conhece. Crie novos archetypes somente se realmente considerar importante e procure personalizar somente o necessário.

Referências:

Por MARCIA TANIMOTO

Formada em Informática - UEM/Maringá. Analista de Sistemas, apaixonada pela profissão, curiosa e MATERANA de coração.

Postado em: 26 de setembro de 2016

Confira outros artigos do nosso blog

REST não é JSON

21 de agosto de 2017

Bruno Sofiato

[Webinar] Profile de aplicações Java com Oracle Mission Control e Flight Recorder

24 de julho de 2017

Danival Calegari

Criando Mocks de serviços REST com SoapUI

27 de junho de 2017

Monise Costa

JavaScript 6: diferença entre var, let e const

09 de maio de 2017

Otávio Felipe do Prado

Deixe seu comentário