Módulos Maven + Criando um único módulo específico

384

Eu tenho um projeto Maven multi-módulo com um projeto pai Pe três sub-módulos A, Be C. Ambos Be Csão projetos de guerra e ambos dependem A.

Eu posso escrever mvn compileem Pe 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 Bdiretó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?

  1. Preciso executar mvn packagetoda a hierarquia do projeto quando realmente quero B?

  2. 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 Aainda está em desenvolvimento ativo.

Alguma prática recomendada aqui?

Brian Ferris
fonte
possível duplicata do Maven e módulos dependentes
Oberlies

Respostas:

696

Alguma prática recomendada aqui?

Use as opções avançadas de reator Maven , mais especificamente:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Portanto, basta cdentrar no diretório P pai e executar:

mvn install -pl B -am

E isso criará B e os módulos exigidos por B.

Observe que você precisa usar dois pontos se estiver referenciando um artifactIddiferente do nome do diretório:

mvn install -pl :B -am

Conforme descrito aqui: https://stackoverflow.com/a/26439938/480894

Pascal Thivent
fonte
15
Para quem acessa esta página em 2011, esta é a melhor resposta. Agora existe um suporte melhor para multi-módulos no próprio maven (Maven 2.1 e superior), você não precisa usar o plug-in do reator.
Spedge
17
Outra opção muito útil é "-amd, --also-make-dependents", que cria todos os módulos dependentes de projetos na lista de reatores.
deterb
11
Que tal construir um módulo neto?
Bax
12
@Bax, use mvn install -pl .,parent/child,parent/child/grandchild Use vírgula para separar vários projetos e. para pai pom
Neo
11
Quando tento clean packageum módulo dessa maneira, ele não consegue resolver as dependências do reator que ainda não estão instaladas. Com -amele irá desnecessariamente reconstruir os deps.
bacia
18

Say pom.xml Parent contém 6 módulos e você deseja executar A , B e F .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd no projeto pai

 mvn --projects A,B,F --also-make clean install

OU

mvn -pl A,B,F -am clean install

OU

mvn -pl A,B,F -amd clean install

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.

Waqas Ahmed
fonte
8

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 installno 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 installno projeto pai se tiver atualizado alguma parte do código.

Victor Hugo
fonte
3
Seria um pesadelo durante o desenvolvimento, a imagem de que depois de fazer uma correção no submódulo, você a instalará e, em seguida, iniciará o contêiner do servlet. A vida é curta :(
hguser 25/11/2015
7

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.

Vendedor rico
fonte
11
Existe uma maneira fácil de garantir que todos os projetos dependentes do meu projeto de destino tenham sido instalados? A hierarquia que tenho é realmente muito mais complexa do que a descrita aqui, portanto, lembre-se de que eu executei o mvn install para cada projeto dependente desde que fiz as alterações de código pela última vez.
11139 Brian Ferris
Sim, usando módulos para criar o conjunto de projetos, consulte o link adicionado à resposta original.
Vendedor rico
5

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.

deter
fonte
3
Essa costumava ser a resposta certa, mas com o Maven 2.1 você não precisa mais usar o plug-in do reator. Veja a resposta de Pascal neste tópico relacionada a "Opções avançadas de reatores"
Spedge
3

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 -amou -plconforme descrito na resposta aceita. Se você estiver usando uma versão do maven anterior à v2.1, altere-a primeiro :)

Zac Thompson
fonte
Grmphh ... então eu vou acabar com tantos projetos agregadores quanto projetos.
Kris
@Kris Eu não recomendaria mais isso. Vou deixar aqui, caso alguém ainda queira saber como, mas eu sempre uso os sinalizadores -am e -pl agora. Eu atualizei minha resposta.
Zac Thompson