Estou tentando descobrir como organizar muitos (cerca de 50+) projetos maven2, para que eles possam implantar em um repositório central do Nexus. Ao usar a mvn deploy
meta, é necessário especificar o destino na tag DistributionManagement como este:
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
Agora, eu não quero que cada pom.xml (daqueles 50+) contenha este bloco repetidamente. Meu primeiro pensamento seria o settings.xml
arquivo, mas parece que não é possível (por design) defini-lo lá. Então, a primeira pergunta seria: por que isso acontece? Se fosse possível, eu poderia especificá-lo no settings.xml da distribuição maven2, que poderia ser distribuído a todos os desenvolvedores.
A única solução possível que encontrei foi criar um projeto master-pom para toda a organização, que contenha essas configurações, e fazer todos os outros pom.xml dependerem desse master-pom via <parent>
tag. Mas isso parece meio estranho em compilações de vários módulos:
- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
- Project 1 module pom (with pm as parent)
- Project 2 module pom (with pm as parent)
Normalmente eu li em toda a documentação que o módulo poms deve usar o pom pai, não algum diferente. Mas depois de ler o site maven sobre Herança x Agregação, está escrito que é realmente possível.
Um problema que encontrei foi com a geração do site maven, que parece ter problemas com esta configuração (os módulos não são vinculados corretamente se não tiverem uma referência direta)
Então, esta é uma abordagem válida? Alguma outra solução mais simples e óbvia para o problema?
Respostas:
A melhor solução para isso é criar um projeto de arquivo pom pai simples (com empacotamento 'pom') genericamente para todos os projetos de sua organização.
Isso pode ser construído, lançado e implantado em seu nexo local para que todos tenham acesso a seu artefato.
Agora, para todos os projetos que você deseja usar, basta incluir esta seção:
Esta solução permite adicionar facilmente outras coisas comuns a todos os projetos da sua empresa. Por exemplo, se você quiser padronizar o uso do JUnit para uma versão específica, este seria o lugar perfeito para isso.
Se você tem projetos que usam estruturas de vários módulos que têm seus próprios pais, o Maven também suporta herança de encadeamento, então é perfeitamente aceitável fazer o arquivo pom pai do seu projeto referir-se ao pom pai da sua empresa e ter os módulos filhos do projeto nem mesmo cientes de seu pai da empresa.
Vejo em sua estrutura de projeto de exemplo que você está tentando colocar seu projeto pai no mesmo nível de seu pom agregador. Se seu projeto precisa de seu próprio pai, a melhor abordagem que encontrei é incluir o pai no mesmo nível que o resto dos módulos e ter seu arquivo pom.xml agregador na raiz de onde existem todos os diretórios de seus módulos.
O que você faz com essa estrutura é incluir seu módulo pai no agregador e construir tudo com um
mvn install
do diretório raiz.Usamos essa solução exata na minha organização e ela resistiu ao teste do tempo e funcionou muito bem para nós.
fonte
Não há necessidade de um POM pai.
Você pode omitir a parte DistributionManagement inteiramente em seu poms e configurá-lo em seu servidor de compilação ou em settings.xml.
Para fazer isso no servidor de compilação, basta passar para o
mvn
comando:Consulte https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html para obter detalhes sobre quais opções podem ser definidas.
Também é possível definir isso no seu
settings.xml
.Basta criar um perfil que esteja habilitado e contenha a propriedade.
Configurações de exemplo.xml:
Certifique-se de que as credenciais para "instantâneos" e "lançamentos" estão na
<servers>
seção de seu settings.xmlAs propriedades altSnapshotDeploymentRepository e altReleaseDeploymentRepository são apresentadas com maven-deploy-plugin versão 2.8. Versões mais antigas falharão com a mensagem de erro
Para corrigir isso, você pode aplicar uma versão mais recente do plug-in:
fonte