Vivendo e Aprendendo

Experiência prática na administração de Banco de Dados

Herança de Projeto vs Agregação de Projeto

by Gilberto C. Andrade on 15 Junho 2011

Tagged as: Java, maven,

Requisito: The packaging type required to be pom for parent and aggregation (multi-module) projects.
**Tradução: **para que você possa criar ou transformar um projeto em um que seja pai (PARENT) ou agregação (AGGREGATION), necessita-se definir seu empacotamento (PACKING) para pom, assim:

 <modelVersion>4.0.0</modelVersion>  <groupId>com.google.constructor</groupId>  <artifactId>park-samples</artifactId>  <!–The packaging type required to be pom for parent and aggregation (multi-module) projects.–>  <packaging>pom</packaging>  <version>1.0-SNAPSHOT</version>  <name>Apache Click Park Samples Project</name>  <url>http://code.google.com/p/construtor</url>  <description>  A parent POM used for all the projects  </description>

Criei um projeto hospedado no google para armazenar códigos java - base de aprendizado na linguagem java, especialmente nas especificações Servlet e JPA.
Entre estes códigos, em especial, quero destacar o park-samples. Este é estruturado utilizando tanto herança quanto agregação:

gilberto@dhcppc0:~/dev/netbeans-config/park-samples> tree –dirsfirst -L 3 . |– docs | |– evolus.pencil | | |– EditLegalEntity.ep | | </span>-- EditNaturalPerson.ep
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- power.architect
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- park.architect
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">– park-er.pdf | |– 03000001.png | </span>-- 03000003_en.png
<span style="color: #000000; font-weight: bold;">|</span>-- park-cayenne
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- src
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- main
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">test | |– nbactions.xml | |– nb-configuration.xml | </span>-- pom.xml
<span style="color: #000000; font-weight: bold;">|</span>-- park-jpa
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- src
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- main
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">test | |– LICENSE.txt | |– nbactions.xml | |– nb-configuration.xml | |– pom.xml | </span>-- README.txt
<span style="color: #000000; font-weight: bold;">|</span>-- park-multi-module
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- core
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- src
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- nbactions.xml
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- nb-configuration.xml
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- pom.xml
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">– README.txt | |– web | | |– src | | </span>-- pom.xml
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- LICENSE.txt
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">|</span>-- pom.xml
<span style="color: #000000; font-weight: bold;">|</span>   <span style="color: #000000; font-weight: bold;">– README.txt |– LICENSE.txt |– pom.xml `– README.txt

Veja que marquei o pom do diretório raiz como pai(PARENT), mudando o tipo de empacotamento. Mas você pode perguntar: o que difere um do outro?
Bom, primeiro devo dizer que usamos herança em arquivos maven para compartilhar configurações, dependências e até recursos - dê uma boa olhada neste pom e você verá ajustes que teria de repetir em praticamente todos os sub-projetos. Já a agregação, usamos para agrupar (óbvio né! :)) projetos que precisam ser construídos juntos - quando executar mvn clean (ou outro comando) no pai, ocorrerá o mesmo nos filhos, tipo efeito cascata.

Para a herança funcionar precisamos adicionar uma seção (tag parent) no pom do sub-projeto:

 <modelVersion>4.0.0</modelVersion>  <parent>  <groupId>com.google.constructor</groupId>  <artifactId>park-samples</artifactId>  <version>1.0-SNAPSHOT</version>  </parent>  <artifactId>park-jpa</artifactId>  <packaging>war</packaging>  <name>Parking Control[JPA]</name>

Quando quero agregar projetos, tenho que configurar **o projeto que será o agregador **através da seção módulos (modules):

    <parent>
        <groupId>com.google.constructor</groupId>
        <artifactId>park-samples</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>    
    <artifactId>park-multi-module</artifactId>
    <packaging>pom</packaging>
    <name>Parking Control[MULTI-MODULE]</name>
    <description>
        A mult-module project using maven aggregation
    </description>
 
...
 
   <modules>
        <module>core</module>
        <module>web</module>
    </modules>

Repare que neste sub-projeto usei os dois conceitos: herança (herdando as configurações do pai) e agregação (este pom agrupa dois outros projetos).

Para os sub-projetos do projeto park-multi-module, poderia adicionar a seção parent como fiz com os outros(apontando para park-samples), mas perderia o benefício da herança. Então o fiz apontando para o próprio park-multi-module, pois este já herda do raiz. Legal, né! :)

comments powered by Disqus