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][1]: 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][2]:

    <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][3] 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][4]:

gilberto@dhcppc0:~/dev/netbeans-config/park-samples> tree --dirsfirst -L 3
.
|-- docs
|   |-- evolus.pencil
|   |   |-- EditLegalEntity.ep
|   |   `-- EditNaturalPerson.ep
|   |-- power.architect
|   |   |-- park.architect
|   |   `-- park-er.pdf
|   |-- 03000001.png
|   `-- 03000003_en.png
|-- park-cayenne
|   |-- src
|   |   |-- main
|   |   `-- test
|   |-- nbactions.xml
|   |-- nb-configuration.xml
|   `-- pom.xml
|-- park-jpa
|   |-- src
|   |   |-- main
|   |   `-- test
|   |-- LICENSE.txt
|   |-- nbactions.xml
|   |-- nb-configuration.xml
|   |-- pom.xml
|   `-- README.txt
|-- park-multi-module
|   |-- core
|   |   |-- src
|   |   |-- nbactions.xml
|   |   |-- nb-configuration.xml
|   |   |-- pom.xml
|   |   `-- README.txt
|   |-- web
|   |   |-- src
|   |   `-- pom.xml
|   |-- LICENSE.txt
|   |-- pom.xml
|   `-- 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][2] 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