Parece haver várias maneiras de estruturar os pais-pais em uma compilação de multiprojetos e eu me pergunto se alguém pensou sobre quais são as vantagens / desvantagens de cada maneira.
O método mais simples de ter um pom pai seria colocá-lo na raiz de um projeto, ou seja,
myproject/
myproject-core/
myproject-api/
myproject-app/
pom.xml
em que pom.xml é o projeto pai e descreve os módulos -core -api e -app
O próximo método é separar o pai em seu próprio subdiretório, como em
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
Onde o pom pai ainda contém os módulos, mas eles são relativos, por exemplo ../myproject-core
Finalmente, há a opção em que a definição do módulo e o pai são separados como em
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
pom.xml
Onde o pom principal contém qualquer configuração "compartilhada" (dependencyManagement, propriedades etc.) e o myproject / pom.xml contém a lista de módulos.
A intenção é ser escalável para uma construção em larga escala, portanto deve ser escalável para um grande número de projetos e artefatos.
Algumas perguntas bônus:
- Onde é o melhor lugar para definir as várias configurações compartilhadas como no controle de origem, diretórios de implantação, plug-ins comuns etc. (estou assumindo que o pai, mas muitas vezes fui mordido por isso e eles acabaram em cada projeto em vez de comum).
- Como o plugin maven-release, hudson e nexus lidam com a maneira como você configura seus multiprojetos (possivelmente uma pergunta gigante, é mais se alguém foi pego quando, pela forma como uma compilação de multiprojetos foi criada)?
Edit: Cada um dos subprojetos tem seu próprio pom.xml, deixei de fora para mantê-lo conciso.