Introdução ao Maven por Balaji Varnasi e Sudha Belida (tradução)

De um tradutor: alguns anos atrás, estabeleci o objetivo de conhecer rapidamente, mas com bastante firmeza, uma estrutura tão usada como o Apache Maven . Quase imediatamente, consegui encontrar a literatura relevante, mas fiquei um pouco surpreso pelo fato de todos os materiais complexos serem exclusivamente em inglês, enquanto em russo havia muitos artigos espalhados, mas não consegui encontrar um livro completo que pudesse ser lido de capa a capa conseguiu. Como resultado, para a leitura, escolhi um pequeno livro, Introducing Maven, escrito por Balaji Varnasi e Sudha Belida e publicado pela Apress em 2014. Como todas as tarefas foram resolvidas, gradualmente dei à luz uma tradução desta publicação, que, embora esteja na minha mesa há alguns anos, ainda pode ser útil para a comunidade.

Aqui dou uma tradução de apenas um dos capítulos deste livro, mas o todo pode ser baixado aqui desses links em inglês ou em russo (PDF).

Capítulo 6: Arquétipos Maven


Até esse ponto, você criou o projeto Maven manualmente, criando pastas e arquivos pom.xml do zero. Isso pode ser entediante, especialmente se você costuma criar projetos. Para resolver esse problema, o Maven fornece arquétipos. Os arquétipos do Maven são projetos predefinidos que permitem aos usuários criar novos projetos com facilidade.

Os arquétipos do Maven também fornecem uma base conveniente para compartilhar experiências e garantir a consistência da estrutura de diretórios padrão do Maven. Por exemplo, uma empresa pode criar um arquétipo com uma folha de estilos em cascata ( CSS ) da empresa, bibliotecas aprovadas por JavaScript e componentes reutilizáveis. Os desenvolvedores que usam esses arquétipos para criar projetos seguirão automaticamente os padrões da empresa.

Arquétipos incorporados


Fora da caixa, o Maven fornece aos desenvolvedores centenas de arquétipos. Além disso, existem muitos projetos de código aberto que fornecem arquétipos adicionais que você pode baixar e usar. O Maven também fornece arquétipos de plug-in com objetivos para criar arquétipos e gerar projetos a partir de arquétipos.

O plug-in de arquétipo possui um destino de geração que permite visualizar e selecionar o arquétipo necessário. A Listagem 6-1 exibe os resultados da execução do destino de geração na linha de comandos. Como você pode ver, 491 arquétipos foram escolhidos (em 2018 já havia mais de 2 mil - aproximadamente. Transl.) . O uso de vários deles é discutido neste capítulo.

Listagem 6-1. O plugin do arquétipo Maven gera chamada de destino

$mvn archetype:generate [INFO] Scanning for projects... [INFO] [INFO] ----------------------------------------------------------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] ----------------------------------------------------------------------- [INFO] [INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone- pom >>> [INFO] [INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone- pom <<< [INFO] [INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone- pom [INFO] Generating project in Interactive mode [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0) ........................... ........................... 1176: remote -> ru.yandex.qatools.camelot:camelot-plugin (-) 1177: remote -> se.vgregion.javg.maven.archetypes:javg-minimal-archetype (-) 1178: remote -> sk.seges.sesam:sesam-annotation-archetype (-) 1179: remote -> tk.skuro:clojure-maven-archetype (A simple Maven archetype for Clojure) 1180: remote -> tr.com .lucidcode:kite-archetype (A Maven Archetype that allows users to create a Fresh Kite project) 1181: remote -> uk.ac.rdg.resc:edal-ncwms-based-webapp (-) 1182: local -> com.inflinx.book.ldap:practical-ldap-empty-archetype (-) 1183: local -> com.inflinx.book.ldap:practical-ldap-archetype (-) Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 491: 

Criação de projeto da Web


O Maven fornece o arquétipo maven-archetype-webapp para gerar um aplicativo da web. Vamos criar esse aplicativo chamando o seguinte comando na pasta C: \ apress \ gswm-book \ chapter6 :

 mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp 

Este comando é executado interativamente. Para perguntas recebidas, insira as seguintes informações:

 Define value for property 'groupId': : com.apress.gswmbook Define value for property 'artifactId': : gswm-web Define value for property 'version': 1.0-SNAPSHOT: : <<Hit Enter>> Define value for property 'package': com.apress.gswmbook: : war Confirm the properties configuration: groupId: com.apress.gswmbook artifactId: gswm-web version: 1.0-SNAPSHOT package: war Y: <<Hit Enter>> 

A estrutura de pastas gerada deve se parecer com a mostrada na Figura 6-1 :

Figura 6-1. Estrutura do projeto web Maven



O arquivo pom.xml é mínimo e contém uma única dependência - JUnit . O Maven pode simplificar o lançamento do seu aplicativo da Web usando servidores da Web incorporados, como Tomcat ou Jetty . A Listagem 6-2 exibe o arquivo pom.xml modificado com o plug-in do Tomcat adicionado.

Listagem 6-2. Arquivo pom.xml modificado com plug-in Tomcat incorporado

 <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.apress.gswmbook</groupId> <artifactId>gswm-web</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>gswm-web Maven Webapp</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> <build> <finalName>gswm-web</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build> </project> 

Para executar este aplicativo Web no servidor Tomcat , chame o seguinte comando no diretório raiz do projeto:

 mvn tomcat7:run 

Você verá um projeto detalhado e uma saída semelhante à mostrada na Listagem 6-3 .

Listagem 6-3. Saída de comando de execução do Tomcat

 Oct 11, 2014 12:08:43 PM org.apache.catalina.core.StandardService startInternal INFO: Starting service Tomcat Oct 11, 2014 12:08:43 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.47 Oct 11, 2014 12:08:45 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [334] milliseconds. Oct 11, 2014 12:08:45 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-8080"] 

Agora inicie o seu navegador e vá para localhost : 8080 / gswm-web / . Você deve ver uma página da web como a mostrada na Figura 6-2 .

Figura 6-2. Projeto da Web em execução em um navegador



Projeto multimodular


Os projetos Java Enterpise Edition (JEE) geralmente são divididos em vários módulos para facilitar o desenvolvimento e a manutenção. Cada um desses módulos produz artefatos como Enterprise JavaBeans (EJBs) , serviços da web, projetos da web e JARs do cliente. O Maven suporta o desenvolvimento de projetos JEE tão grandes, permitindo que você hospede vários projetos Maven em outro projeto Maven. A estrutura de um projeto com vários módulos é mostrada na Figura 6-3 . O projeto pai possui um arquivo pom.xml e vários projetos Maven.

Figura 6-3. A estrutura de um projeto com vários módulos



Até o final deste capítulo, explicaremos como criar um projeto com vários módulos para uma tarefa na qual você precisa dividir um projeto grande em um aplicativo da web (artefato WAR ) que fornece uma interface com o usuário, um projeto de serviço (artefato JAR ) que contém o código da camada de serviço e o projeto Persistência contendo o código no nível do repositório. A Figura 6-4 mostra uma representação visual desse cenário.

Figura 6-4. Projeto multimodular Maven



Vamos começar o processo criando um projeto pai. Para fazer isso, execute o seguinte comando em um prompt de comando na pasta C: \ apress \ gswm-book \ chapter6:

 mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-parent -Dversion=1.0.0-SNAPSHOT -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=pom-root 

O arquétipo pom-root cria a pasta gswm-parent e nela o arquivo pom.xml .

Conforme mostrado na Listagem 6-4 , o arquivo pom.xml gerado possui conteúdo mínimo. Observe que o tipo pom é especificado na etiqueta de embalagem do projeto pai.

Listagem 6-4. Arquivo pai 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>com.apress.gswmbook</groupId> <artifactId>gswm-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>gswm-parent</name> </project> 

Agora crie um projeto da web executando o seguinte comando na pasta C: \ apress \ gswm-book \ chapter6 \ gswm-parent :

 mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-web -Dversion=1.0.0-SNAPSHOT -Dpackage=war -DarchetypeArtifactId=maven-archetype-webapp 

No processo de geração deste projeto da web, você forneceu ao Maven coordenadas como groupId , version etc., como parâmetros passados ​​para o destino de geração, que criou o projeto gswm-web .

O próximo passo é criar um projeto de serviço. Na pasta C: \ apress \ gswm-book \ chapter6 \ gswm-parent, execute o seguinte comando:

 mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-service -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 

Observe que você não especificou o parâmetro package , como O maven-archetype-quickstart cria um projeto JAR padrão. Observe também o uso do parâmetro InteractiveMode . Simplesmente diz ao Maven para executar o comando sem solicitar ao usuário nenhuma informação.

Semelhante à etapa anterior, crie o seguinte projeto Java gswm-repository executando o seguinte comando na pasta C: \ apress \ gswm-book \ chapter6 \ gswm-parent :

 mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-repository -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 

Agora que você possui todos os projetos gerados, consulte o arquivo pom.xml na pasta gswm-parent . A Listagem 6-5 exibe seu conteúdo.

Listagem 6-5. Arquivo pom.xml pai com módulos

 <?xml version="1.0" encoding="UTF-8"?> <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>com.apress.gswmbook</groupId> <artifactId>gswm-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>gswm-parent</name> <modules> <module>gswm-web</module> <module>gswm-service</module> <module>gswm-repository</module> </modules> </project> 

O elemento modules permite declarar módulos filhos em um projeto de vários módulos. À medida que cada módulo é gerado, o Maven os registra como filhos. Além disso, modifica os arquivos pom.xml dos próprios módulos, adicionando informações sobre o pom.xml pai a eles . A Listagem 6-6 exibe o arquivo pom.xml do projeto gswm-web , que especifica o elemento pom pai.

Listagem 6-6. Arquivo pom.xml do módulo da Web

 <?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.apress.gswmbook</groupId> <artifactId>gswm-parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <groupId>com.apress.gswmbook</groupId> <artifactId>gswm-web</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <name>gswm-web Maven Webapp</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> <build> <finalName>gswm-web</finalName> </build> </project> 

Agora que toda a infraestrutura está instalada, você pode montar o próximo projeto. Basta executar o comando mvn package na pasta gswm-project , conforme mostrado na Listagem 6-7 .

Listagem 6-7. Comando do pacote Maven iniciado no diretório do projeto pai

 C:\apress\gswm-book\chapter6\gswm-parent>mvn package [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] gswm-parent [INFO] gswm-web Maven Webapp [INFO] gswm-service [INFO] gswm-repository [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] gswm-parent ....................................... SUCCESS [0.001s] [INFO] gswm-web Maven Webapp ............................. SUCCESS [1.033s] [INFO] gswm-service ...................................... SUCCESS [0.552s] [INFO] gswm-repository ................................... SUCCESS [0.261s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.949s [INFO] Finished at: Mon Oct 13 23:09:21 MDT 2014 [INFO] Final Memory: 6M/15M [INFO] ------------------------------------------------------------------------ 

Criando arquétipos


O Maven fornece várias maneiras de criar um novo arquétipo. Aqui vamos usar um projeto existente para isso.

Vamos começar criando um projeto de protótipo que será usado como base para gerar o arquétipo. Este projeto será compatível com o Servlet 3.0 e contém um Status Servlet que retorna um código de status HTTP 200 (“OK” - solicitação bem-sucedida). Em vez de criar um projeto da Web a partir do zero, copie o projeto gswm-web gerado anteriormente e crie o protótipo gswm-web na pasta C: \ apress \ gswm-book \ chapter6 . Faça as seguintes alterações no projeto que você acabou de copiar:

1. Remova todos os outros recursos, como arquivos específicos do IDE (Ambiente de Desenvolvimento Integrado) ( .project , .classpath , etc.) que você não deseja incluir no arquétipo.

2. Substitua o conteúdo do arquivo web.xml da pasta webapp / WEB-INF . Isso configurará o aplicativo Web para usar o Servlet 3.0 :

 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> </web-app> 

3. Adicione a dependência do Servlet 3.0 ao arquivo pom.xml . O conteúdo atualizado do pom.xml é mostrado na Lista 6-8 .

Listagem 6-8. Arquivo Pom.xml com dependência de servlet

 <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.apress.gswmbook</groupId> <artifactId>gswm-web</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>gswm-web Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>gswm-web</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build> </project> 

4. Desde desenvolveremos um projeto web em Java e, em seguida, criaremos uma pasta chamada java no diretório src / main . Da mesma forma, crie as pastas test / java e test / resources no diretório src .

5. Crie o arquivo AppStatusServlet.java pertencente ao pacote com.apress.gswmbook.web.servlet no diretório src / main / java . O pacote com.apress.gswmbook.web.servlet é convertido na estrutura de pastas com \ apress \ gswmbook \ web \ servlet . O código-fonte para o arquivo AppStatusServelet.java é mostrado na Listagem 6-9 .

Listagem 6-9. Código-fonte para a classe Java AppStatusServlet

 package com.apress.gswmbook.web.servlet; import javax.servlet.annotation.WebServlet; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; @WebServlet("/status") public class AppStatusServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter writer = response.getWriter(); writer.println("OK"); response.setStatus(response.SC_OK); } } 

Um projeto de protótipo em estrutura será uma viagem ao representado na Fig . 6-5 .

Fig. 6-5. Projeto de protótipo gerado



Usando a linha de comando, acesse a pasta gswm-web-prototype do projeto e execute o seguinte comando:

 mvn archetype:create-from-project 

No final do comando, você verá a mensagem Arquétipo criado em destino / fontes-geradas / arquétipo . O arquétipo gerado está localizado na pasta gswm-web-prototype / target / managed-sources / archetype .

A próxima etapa é transferir o artefato recém-gerado para uma pasta gswm-web-archetype separada para configurá-lo antes da publicação. Para fazer isso, execute as seguintes etapas:

1. Crie a pasta gswm-web-archetype no diretório C: \ apress \ gswm-book \ chapter6 .

2. Copie os subdiretórios e os arquivos da pasta C: \ apress \ gswm-book \ chapter6 \ gswm-web-prototype \ target \ generator- sources \ archetype para a pasta gswm-web-archetype .

3. Remova o subdiretório de destino da pasta C: \ apress \ gswm-book \ chapter6 \ gswm-web-archetype .

A estrutura de pastas do gswm-web-archetype deve ser semelhante à mostrada na Figura 6-6 .

Fig. 6-6. Estrutura do projeto de arquétipo da Web



Vamos iniciar o processo de modificação com o arquivo pom.xml localizado na pasta gswm-web-archetype \ src \ main \ resources \ archetype-resources . Altere finalName no pom.xml de gswm-web para $ {artifactId}. Durante o processo de criação do projeto, o Maven substituirá a expressão $ {artifactId} pelo valor fornecido pelo usuário.

Quando um projeto é criado a partir de um arquétipo, o Maven solicita ao usuário o nome do pacote. O Maven cria uma estrutura de pastas correspondente ao pacote localizado no diretório src / main / java do projeto criado. Em seguida, o Maven move todo o conteúdo da pasta archetype-resources / src / main / java archetype para este pacote. Porque Se você deseja que o AppStatusServlet esteja no subpacote web.servlet , crie a pasta web / servlet e mova o AppStatusServlet para lá. O novo local do AppStatusServlet.java é mostrado na Figura 6-7 .

Fig. 6-7. AppStatusServlet no pacote web.servlet



Abra AppStatusServlet.java e altere o nome do pacote do pacote $ {package}; no pacote $ {package} .web.servlet;
A etapa final na criação de um arquétipo é executar o seguinte comando na linha de comando, localizada na pasta gswm-web-archetype:

 mvn clean install 

Usando arquétipos


Após a instalação do arquétipo, a maneira mais fácil de criar um projeto é, na pasta C: \ apress \ gswm-book \ chapter6 , execute o seguinte comando:
 mvn archetype:generate -DarchetypeCatalog=local 


Em resposta às consultas do Maven, insira os valores mostrados na Lista 6-10 e você verá o projeto criado.

Listagem 6-10. Criando um novo projeto usando um arquétipo

 C:\apress\gswm-book\chapter6>mvn archetype:generate -DarchetypeCatalog=local [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] Generating project in Interactive mode [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache. maven.archetypes:maven-archetype-quickstart:1.0) Choose archetype:1: local -> com.apress.gswmbook:gswm-web-archetype (gswm-web-archetype) Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 1 Define value for property 'groupId': : com.apress.gswmbook Define value for property 'artifactId': : test-project Define value for property 'version': 1.0-SNAPSHOT: : Define value for property 'package': com.apress.gswmbook: : Confirm properties configuration: groupId: com.apress.gswmbook artifactId: test-project version: 1.0-SNAPSHOT package: com.apress.gswmbook Y: : ------------------------------------------------------------------------------ project [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1:27.635s [INFO] Finished at: Mon Oct 13 23:36:01 MDT 2014 [INFO] Final Memory: 9M/22M [INFO] ------------------------------------------------------------------------ 

Porque o arquivo pom.xml para test-project já contém o plug-in Tomcat e execute o comando mvn tomcat7: run na pasta C: \ apress \ gswmbook \ chapter6 \ test-project para iniciar o projeto . Abra um navegador e acesse localhost : 8080 / test-project / status . Você verá a inscrição OK , como mostra a Figura 6-8 .

Fig. 6-8. Página gerada pelo projeto gerado



Sumário


Os arquétipos do Maven são stubs de projetos que permitem iniciar rapidamente novos projetos. Neste capítulo, arquétipos embutidos foram usados ​​para gerar projetos complexos do Maven, como projetos da Web ou projetos com vários módulos. Você também aprendeu como criar e usar arquétipos personalizados.

No próximo capítulo, você aprenderá os conceitos básicos de geração, documentação e geração de relatórios usando o Maven.

Source: https://habr.com/ru/post/pt421323/


All Articles