Eu tenho um projeto Maven multi-módulo com um projeto pai P
e três sub-módulos A
, B
e C
. Ambos B
e C
são projetos de guerra e ambos dependem A
.
Eu posso escrever mvn compile
em P
e têm todos os sub-módulos devidamente compilados. O problema surge quando eu quero fazer operações para módulos específicos.
Eu gostaria de poder empacotar uma guerra por projeto B
, mas quando executo o comando package do B
diretório 's, ele reclama que não consegue encontrar as dependências para A
.
Entendo com esta pergunta: Maven e módulos dependentes que talvez o Maven não seja realmente projetado para esse tipo de resolução de dependência, mas isso sugere a questão de como empacotar B
?
Preciso executar
mvn package
toda a hierarquia do projeto quando realmente queroB
?Preciso instalar instantâneos de A no meu repositório local toda vez que eu quiser empacotar
B
?
Esse segundo cenário não é muito divertido quando A
ainda está em desenvolvimento ativo.
Alguma prática recomendada aqui?
fonte
Respostas:
Use as opções avançadas de reator Maven , mais especificamente:
Portanto, basta
cd
entrar no diretório P pai e executar:E isso criará B e os módulos exigidos por B.
Observe que você precisa usar dois pontos se estiver referenciando um
artifactId
diferente do nome do diretório:Conforme descrito aqui: https://stackoverflow.com/a/26439938/480894
fonte
mvn install -pl .,parent/child,parent/child/grandchild
Use vírgula para separar vários projetos e. para pai pomclean package
um módulo dessa maneira, ele não consegue resolver as dependências do reator que ainda não estão instaladas. Com-am
ele irá desnecessariamente reconstruir os deps.Say pom.xml Parent contém 6 módulos e você deseja executar A , B e F .
1- cd no projeto pai
OU
OU
Nota: Quando você especifica um projeto com a opção -am , o Maven cria todos os projetos dos quais o projeto especificado depende (direta ou indiretamente). O Maven examinará a lista de projetos e percorrerá a árvore de dependência, encontrando todos os projetos que ele precisa criar.
Enquanto o -AM comando faz com que todos os projetos exigidos por um projeto específico em uma compilação de multi-módulo, o -amd ou --também-Make-dependentes opção configura Maven para construir um projeto e qualquer projeto que depende desse projeto. Ao usar --also-make-dependents , o Maven examinará todos os projetos em nosso reator para encontrar projetos que dependem de um projeto específico. Ele criará automaticamente esses projetos e nada mais.
fonte
O Maven foi projetado absolutamente para esse tipo de dependência.
mvn package
não instala nada no seu repositório local, apenas empacota o projeto e o deixa na pasta de destino.Faça
mvn install
no projeto pai (A), com isso, todos os submódulos serão instalados no repositório Maven do computador, se não houver alterações, você só precisará compilar / empacotar o submódulo (B) e o Maven levará o pacote já e dependências instaladas corretamente.Você só precisa do
mvn install
no projeto pai se tiver atualizado alguma parte do código.fonte
Se você já executou o mvn install no projeto B, ele será instalado no seu repositório local, portanto, quando você criar o pacote A Maven poderá resolver a dependência. Portanto, desde que você instale o projeto B cada vez que o alterar, suas compilações para o projeto A estarão atualizadas.
Você pode definir um projeto com vários módulos com um pom agregador para criar um conjunto de projetos.
Também vale a pena mencionar o m2eclipse , ele integra o Maven ao Eclipse e permite (opcionalmente) resolver dependências do espaço de trabalho. Portanto, se você estiver invadindo vários projetos, o conteúdo da área de trabalho será usado para compilação. Quando estiver satisfeito com suas alterações, execute o mvn install (em cada projeto, por sua vez, ou usando um agregador) para colocá-las no seu repositório local.
fonte
Dê uma olhada na minha resposta Maven e módulos dependentes .
O plug - in Maven Reactor foi projetado para lidar com a construção de parte de um projeto.
O objetivo específico que você deseja usá-lo
reactor:make
.fonte
Você diz que "realmente quer apenas B", mas isso é falso. Você deseja B, mas também deseja um A atualizado, se houver alguma alteração ("desenvolvimento ativo").
Portanto, às vezes você deseja trabalhar com A, B e C. Nesse caso, você possui o projeto agregador P. Para o caso em que deseja trabalhar com A e B (mas não deseja C), você deve criar o projeto agregador Q .
Editar 2016 : as informações acima talvez tenham sido relevantes em 2009. A partir de 2016, recomendo ignorar isso na maioria dos casos e simplesmente usar os sinalizadores de linha de comando
-am
ou-pl
conforme descrito na resposta aceita. Se você estiver usando uma versão do maven anterior à v2.1, altere-a primeiro :)fonte