Pergunta

Eu sei que é mauvais ton que pedir duas vezes em um único dia, mas aqui está um outro quebra-cabeças Maven:

I têm um POM principal que define 5 módulos (5 subprojetos). Uma vez que cada módulo é executado exatamente da mesma maneira que eu puxar seção <profile><build> no POM pai para se livrar do código duplicado. Agora - se eu executar construção individual de cada módulo funciona, no entanto, se eu quero construir todos os módulos de uma vez e mover para o diretório pai I obteve o erro uma vez que a primeira coisa Maven tenta executar é o projeto pai-se:

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects

Depois disso compilação falhar por causa de plugin exec tenta executar algo que não está lá. Olhando para a saída é bastante óbvio que reator plugin está dirigindo a construção, mas como eu posso configurar reator para ignorar o pai?

P.S. Para evitar confusão - Estou tentando execução perfil suprimir no pai e habilitá-lo na criança durante a compilação same

Foi útil?

Solução

O que está errado com a construção da mãe?

De fato, em Maven, há dois conceitos diferentes (que são geralmente usados ??ao mesmo tempo):

  • O POM pai
  • A módulos de agregação

A primeira é uma definição de tudo o que é comum com todas as crianças. Você define um pai como um projeto embalados-pom, e você pode instalá-lo em seu repositório.

Quando você constrói um filho deste pai, Maven2 irá recuperar este pai para mesclar o pom pai com o pom criança. Você pode ter um olhar para todo o pom.xml executando o mvn help:effective-pom comando.

Neste caso, o pom pai não vai ser construída, ela só vai ser recuperada a partir do repositório.

O segundo caso é um projeto que contém uma lista modules de sub-projectos. O princípio é que todos os comandos que você executa nesse projeto também será executado em todos os sub-módulos. A ordem dos módulos será definido pelo Reactor, que vai olhar para inter-módulos dependências para encontrar qual módulo deve ser construída antes dos outros. Se não houver dependências, então vai demorar a lista dos módulos como eles são definidos no pom.xml pai.

Neste caso, se você executar um comando no projeto raiz, Maven2 vai primeiro construído o projeto raiz, e em seguida, os sub-módulos. Você não pode ignorar a criação do projeto raiz.


Editar, graças ao comentário RichSeller

Uma explicação completa das diferenças entre multi-módulos (projeto de agregação) e herança (projeto pai) pode ser encontrado no livro Maven, aqui .

Outras dicas

Você não pode ignorar a compilação pai, mas você pode configurar o perfil não pode ser activado com um pouco de hack. mostra esta resposta como para controlar a activação de um perfil a presença ou ausência de um elemento <activation> baseado em arquivo. Desta forma, você pode definir o perfil no pai, mas tê-lo desativado nesse projeto por causa do ser de arquivo marcador presente no pai. projetos filho não teria o arquivo marcador na sua fonte, de modo que o perfil seria ativado para esses projetos.

Atualização para esclarecer: No meu projeto de teste esta configuração significa que o perfil está desactivada no projeto pai (que tem o arquivo em src / main / recursos), mas activado em todos os projetos para crianças que não têm o arquivo em seus recursos diretórios.

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>

Eu quero documento que há comprometimento parcial para a minha situação (graças a vocês sobre os usuários Maven lista de sugestão de discussão). Basicamente o que você precisa para cortar perfil de duas peças. seção configuration reutilizável de plug-in vai para o POM pai, e estadias executions no POM criança. Em seguida, o perfil de encaixe na criança é marcado como inherited e voila - pelo perfil do pai tempo de execução não é executada uma vez que é seção executions faltando. Isto está longe de ser ideal, mas ela não funciona. Consulte a este link por exemplo

Eu não era capaz de implementar "faltando" solução de arquivo, como previsto por Rick Vendedor acima. Parece que uma vez set estado ativo / não-ativo do perfil não será alterada mesmo o arquivo marcador está faltando a partir do módulo (s). No entanto, aqui está a solução exata para o meu problema. Aviso: esta é apenas início disponível com Maven 2.1 +

Se eu tiver um POM pai com 2 módulos definidos: foo e boo seguida, em circunstâncias normais ordem de execução será:

  1. pai
  2. foo
  3. boo

Tudo que eu preciso fazer para pular compilação pai é adicionar esta opção de linha de comando

mvn install –rf foo

Como alternativa, você pode usar --resume-from O que vai fazer é pular pai e continue a partir do módulo foo para baixo. Agora - Estou investigando se isso pode ser alcançado através da configuração Reactor plug-in (P.S -. Não, não pode) , mas mesmo com o interruptor, o cenário acima funciona bem para mim

Isso está implícito pela resposta de @ romaintaz à mesma pergunta, Maven - salto pai compilação de projeto

mas apenas para tornar isso explícito, na pom pai é imperativo que você especificar o elemento embalagem como pom (e não jarra ou guerra).
Exemplo:

<packaging>pom</packaging>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top