Melhor maneira de estruturar um repositório Git para Maven


19

Preciso de alguns conselhos sobre como estruturar nossos projetos no Git. Usamos Java e o Maven é a nossa ferramenta de construção. O Maven assume que todos os seus projetos têm um ancestral comum eventualmente. O Maven também pode ser uma verdadeira rainha do drama quando as coisas não estão configuradas exatamente da maneira como a fundação Apache configura seus projetos (qualquer pessoa que use o plug-in de lançamento provavelmente sabe do que estou falando).

Queremos um pom pai de nível superior que controle as versões do plug-in e construa a configuração (configuração do repositório, quais artefatos construir, convenções de nomenclatura, versões do plug-in, etc.). Maven gostaria que todos os nossos projetos de TI estivessem em subpastas desse projeto principal. Isso implica em um grande repositório Git para a organização.

Isso criará um ambiente muito barulhento. Se houver duas equipes trabalhando em projetos não relacionados, elas constantemente terão que realizar fusões da outra equipe. Idealmente, eu gostaria de ter um repo por projeto.

Mas esse tipo de conflito com o modelo extremamente hierárquico de Maven, que exige subprojetos, subpastas.

Preciso de alguns conselhos sobre como as pessoas reconciliaram esses dois modelos ... obrigado!


Respostas:


19

Você tem 2 opções:
1. por git way: use submodules. Aqui está uma documentação sobre como o git gerencia submodules git submodules . Pessoalmente, não o usei, mas parece adequado ao seu problema.
2. por maven way: no maven, não é obrigatório que seu projeto raiz (configuração) seja hierarquicamente o diretório pai de todos os seus projetos. Você pode ter uma estrutura assim:

configuration
 +-- pom.xml (configuration:XXX)
project1
 +-- pom.xml (project1:1.0-SNAPSHOT)
 !
 +-- module11 
 !     +-- pom.xml (1.0-SNAPSHOT)
 +-- module12
       +-- pom.xml (1.0-SNAPSHOT)
project2
 +-- pom.xml (project2:2.0-SNAPSHOT)
 !
 +-- module21 
 !     +-- pom.xml (2.0-SNAPSHOT)
 +-- module22
       +-- pom.xml (2.0-SNAPSHOT)

configuração, projeto1 e projeto2 estão no mesmo nível de diretório e cada um pode ser um repositório git. Ao criar o projeto1 ou o projeto2, você executa o comando maven no nível do projeto1 ou do projeto2 e o maven tenta buscar o pai (configuração) no repositório do maven e não no diretório pai. Você deve prestar atenção às versões. Eu recomendaria no projeto1 ou no projeto2 manter uma referência a um pai (configuração) com uma versão de lançamento. Para fazer uma liberação, é necessário fazer isso em duas etapas: libere a configuração primeiro e libere o projeto depois. Projeto1 e projeto2 podem evoluir independentemente e não precisam ter a mesma versão de configuração que um pai.

Apenas em casos especiais, quando você deseja ter a configuração e os projetos como versões do INSTANTÂNEO, no projeto1 ou no projeto2, você pode usar a <relativePath>tag inside <parent>tag para apontar para o caminho local da configuração. Eu não recomendo isso, porque criará problemas no ambiente de desenvolvimento (pelo menos para mim no Eclipse)

Peço desculpas pelo meu inglês.


3

A Maven gostaria que todos os nossos projetos de TI estivessem em subpastas desse projeto principal

Não, o Maven simplesmente deseja recuperar os artefatos necessários. A melhor maneira de fazer isso é com um repositório de artefatos, como Nexus ou Artifactory . Cada projeto pode ter seu próprio repositório Git.

Queremos um pom principal de nível superior que controle as versões do plug-in e crie a configuração (configuração do repositório, quais artefatos construir , convenções de nomenclatura, versões do plug-in, etc.

Esse é o seu verdadeiro problema. Faz sentido usar um POM pai para impor a configuração, mas não há razão para combinar configuração com controle de construção. De fato, exceto em um projeto com vários módulos autônomos, eu diria que é uma péssima idéia pelos motivos que você declara (além do fato de que você precisaria criar todos os seus projetos, todos os A Hora).


Estou intimamente familiarizado com o funcionamento do maven. E não, não quero que minhas equipes construam toda a base de código. Normalmente, você selecionava um pequeno número de projetos e os retirava do controle de origem. Como temos um servidor nexus para hospedar artefatos concluídos, não há motivo para construir toda a base de código. E uma vez que sua organização tenha um determinado tamanho, a execução em infraestrutura compartilhada economiza dinheiro. Ter uma configuração central para fazer isso é a única maneira de garantir que funcione sempre.
Jonathan S. Fisher

Caro @parsifal, tenha uma visão da minha pergunta sobre a criação de aplicativos java multi layer stackoverflow.com/questions/49562268/…
Hosein Aqajani #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.