Dependências diferentes para perfis de construção diferentes

115

É possível ter um conjunto diferente de dependências em um arquivo maven pom.xml para perfis diferentes?

por exemplo

mvn -P debug
mvn -P release

Eu gostaria de escolher um arquivo jar de dependência diferente em um perfil que tem os mesmos nomes de classe e implementações diferentes das mesmas interfaces.

izb
fonte
Isso pode ser usado ao direcionar diferentes servidores da web. Por exemplo, ao construir para um servidor JavaEE 5, que oferece libs como JAXB, que você não deve incluir em seu arquivo war, versus construir para um servidor JavaEE 1.4, onde você deve incluir o jar JAXB.
Leonel,

Respostas:

174

Para citar a documentação do Maven sobre isso :

Um elemento de perfil contém uma ativação opcional (um gatilho de perfil) e o conjunto de alterações a serem feitas no POM se esse perfil tiver sido ativado. Por exemplo, um projeto criado para um ambiente de teste pode apontar para um banco de dados diferente daquele da implantação final. Ou as dependências podem ser obtidas de diferentes repositórios com base na versão do JDK usada .

(Ênfase é minha)

Basta colocar a dependência do releaseperfil dentro da própria declaração do perfil e fazer o mesmo para debug.

<perfis>
    <perfil>
        <id> depurar </id>
        …
        <dependências>
            <dependency>… </dependency>
        </dependencies>
        …
    </profile>
    <perfil>
        <id> lançamento </id>
        …
        <dependências>
            <dependency>… </dependency>
        </dependencies>
        …
    </profile>
</profiles>
Aleksandar Dimitrov
fonte
2
Este método fará com que o código não seja resolvido no modo de edição. Se a depuração estiver ativa, o jar de dependência da versão estará ausente e o código será um erro. Como resolver isso?
brucenan
6
você pode definir o escopo da dependência específica do release como 'fornecido' na hierarquia de dependência e redefinir o escopo para 'compilar' na seção de perfil do release. Para que a dependência esteja disponível para a compilação, mas não na guerra final para o perfil de 'depuração'.
dia
@uday Se você colocasse uma resposta mostrando essa abordagem, eu adoraria
votar positivamente
Perfis IMHO são inúteis, pelo menos para dependências: IDEs fornecem erros, dependências param de ser resolvidas, aplicativos não funcionam no final. Eu esperava mais.
Ares
6

Seu groupId, artifactId deve ser tokenizado em seus perfis como propriedades e você pode mover suas dependências para a seção genérica.


fonte
2
Isso só aconteceria se você tivesse 1 dependência. Se o número de dependências diferir entre depuração e liberação, apenas a tokenização não funcionará. Por esse motivo, eu recomendaria não tokenizar e definir explicitamente as dependências na seção de perfil.
Marcel Overdijk,
A outra resposta não funcionou para mim, já que as dependências de perfil padrão ainda estavam incluídas junto com outras dependências de perfil específicas. Sua resposta funcionou muito bem.
Vlad Mihalcea
@Vlad Você removeu a dependência do corpo principal do POM? Caso contrário, você terá duas vezes. (Consulte stackoverflow.com/q/24855678/6944068 sobre como garantir que um perfil esteja sempre ativo.)
toolforger