Herança de Projeto vs Agregação de Projeto
by Gilberto C. Andrade on 15 junho 2011
[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é!