Qual é a diferença entre dependencyManagement
e dependencies
? Eu vi os documentos no site do Apache Maven. Parece que uma dependência definida sob o dependencyManagement
pode ser usada em seus módulos filhos sem especificar a versão.
Por exemplo:
Um projeto pai (Pro-par) define uma dependência sob o dependencyManagement
:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8</version>
</dependency>
</dependencies>
</dependencyManagement>
Então, no filho do Pro-par, posso usar o junit:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
No entanto, gostaria de saber se é necessário definir junit no pom pai? Por que não defini-lo diretamente no módulo necessário?
fonte
<dependencyManagement>
POM pai. Incluir dependências no<dependencyManagement>
gerenciamento centralizado da versão, escopo e exclusões de cada dependência, se e quando você decidir usá-lo. O guia do Maven para gerenciamento de dependências entra em todos os detalhes.dependencyManagement
também controla dependências transitivas) só é verdadeiro quando as dependências são definidas explicitamente: stackoverflow.com/questions/28312975/…dependencies
seção no seu pom pai. Fizemos isso para que todo projeto filho tivesse alguns apache-commons por padrão e não os declarasse o tempo todo.Estou atrasado na moda para essa pergunta, mas acho que vale uma resposta mais clara do que a aceita (o que é correto, mas não enfatiza a parte realmente importante, que você precisa deduzir a si mesmo).
No POM pai, a principal diferença entre o
<dependencies>
e<dependencyManagement>
é esta:Os artefatos especificados na
<dependencies>
seção SEMPRE serão incluídos como uma dependência do (s) módulo (s) filho (s).Os artefatos especificados na
<dependencyManagement>
seção serão incluídos apenas no módulo filho se também tiverem sido especificados na<dependencies>
seção do próprio módulo filho. Por que é bom você perguntar? porque você especifica a versão e / ou escopo no pai e pode deixá-los de fora ao especificar as dependências no POM filho. Isso pode ajudá-lo a usar versões unificadas para dependências para módulos filhos, sem especificar a versão em cada módulo filho.fonte
<dependencyManagement>
mais<dependencies>
na raiz.pom
? As criançaspom
podem ser muito mais curtas.Artifacts specified in the <dependencies> section will ALWAYS be included as a dependency of the child module(s)
que eles também estão incluídos nos pais. Parece que não é possível definir uma dependência para os filhos, mas não para os pais.A documentação no site do Maven é horrível. O que o dependencyManagement faz é simplesmente mover suas definições de dependência (versão, exclusões, etc.) para o pom pai e, em seguida, nos poms filhos, basta colocar o groupId e o artifactId. É isso aí (exceto para o encadeamento pai pom e afins, mas isso também não é realmente complicado - o dependencyManagement vence as dependências no nível pai - mas se tiver alguma dúvida sobre isso ou as importações, a documentação do Maven é um pouco melhor).
Depois de ler todo o lixo 'a', 'b', 'c' no site do Maven e ficar confuso, reescrevi o exemplo deles. Portanto, se você tiver 2 projetos (proj1 e proj2) que compartilham uma dependência comum (betaShared), poderá movê-la para o pom pai. Enquanto você está nisso, você também pode mover quaisquer outras dependências (alpha e charlie), mas apenas se isso fizer sentido para o seu projeto. Portanto, para a situação descrita nas frases anteriores, eis a solução com dependencyManagement no pom pai:
fonte
É como você disse;
dependencyManagement
é usado para extrair todas as informações de dependência em um arquivo POM comum, simplificando as referências no arquivo POM filho.Torna-se útil quando você tem vários atributos nos quais não deseja digitar novamente em vários projetos filhos.
Finalmente,
dependencyManagement
pode ser usado para definir uma versão padrão de um artefato para uso em vários projetos.fonte
Ainda há uma coisa que não está destacada o suficiente, na minha opinião, e que é herança indesejada .
Aqui está um exemplo incremental:
Eu declaro em meu
parent
pom:estrondo! Eu tenho isso no meu
Child A
,Child B
eChild C
módulos:version 18.0
emChild B
se quiser.Mas e se eu acabar não precisando de goiaba
Child C
e nem no futuroChild D
eChild E
módulos?Eles ainda a herdarão e isso é indesejável! É como o cheiro do código Java God Object, no qual você herda alguns bits úteis de uma classe e também uma tonelada de coisas indesejadas.
É aqui que
<dependencyManagement>
entra em jogo. Quando você adiciona isso ao pom pai, todos os módulos filhos param de vê-lo . E, portanto, você é forçado a entrar em cada módulo individual que precisa e declará-lo novamente (Child A
eChild B
, sem a versão).E, obviamente, você não faz isso
Child C
e, portanto, seu módulo permanece enxuto.fonte
<dependencyManagement>
o pom pai, por padrão, as dependências não serão herdadas nos poms filhos? Porque no doc: maven.apache.org/guides/introduction/… ao explicar o segundo uso do<dependencyManagement>
, parece que ele será herdado por padrão. Em uma linha, eles estão dizendo que: "Quando o maven é executado no projeto B, a versão 1.0 dos artefatos a, b, c e d será usada independentemente da versão especificada em seu pom", mesmo que "b" não seja usado em o projeto BExistem algumas respostas que descrevem as diferenças entre
<depedencies>
e<dependencyManagement>
marcam com maven.No entanto, alguns pontos elaborados abaixo de forma concisa:
<dependencyManagement>
permite consolidar todas as dependências (usadas no nível filho pom) usadas em diferentes módulos - clareza , gerenciamento centralizado de versões de dependência<dependencyManagement>
permite atualizar facilmente / fazer downgrade de dependências com base na necessidade; em outro cenário, isso precisa ser exercido em todos os níveis de pom filho - consistência<dependencies>
tag são sempre importadas, enquanto as dependências fornecidas no<dependencyManagement>
pai pom serão importadas apenas se o pom filho tiver a respectiva entrada em seu<dependencies>
tag.fonte
Desculpe, estou muito atrasado para a festa.
Deixe-me tentar explicar a diferença usando
mvn dependency:tree
comandoConsidere o exemplo abaixo
POM dos Pais - Meu Projeto
POM filho - módulo de dados
POM filho - módulo de aplicativo (não possui dependência extra, deixando as dependências vazias)
Ao executar o
mvn dependency:tree
comando, obtemos o seguinte resultadoA goiaba do Google é listada como dependência em todos os módulos (incluindo pai), enquanto o apache commons é listado como dependência apenas no módulo de dados (nem mesmo no módulo pai)
fonte
Se a dependência foi definida no elemento dependencyManagement do pom de nível superior, o projeto filho não precisou listar explicitamente a versão da dependência. se o projeto filho definisse uma versão, substituiria a versão listada na seção dependencyManagement do POM de nível superior. Ou seja, a versão dependencyManagement é usada apenas quando o filho não declara uma versão diretamente.
fonte
No POM pai, a principal diferença entre o
<dependencies>
e<dependencyManagement>
é esta:Artefatos especificados no
<dependencies>
seção SEMPRE serão incluídos como uma dependência do (s) módulo (s) filho (s).Os artefatos especificados na seção serão incluídos apenas no módulo filho se também tiverem sido especificados na seção do próprio módulo filho. Por que é bom você perguntar? porque você especifica a versão e / ou escopo no pai e pode deixá-los de fora ao especificar as dependências no POM filho. Isso pode ajudá-lo a usar versões unificadas para dependências para módulos filhos, sem especificar a versão em cada módulo filho.
fonte
Apenas em minhas próprias palavras,
parent-project
você ajuda a fornecer 2 tipos de dependências:<dependencies>
seçãoparent-project
são herdadas por todos oschild-projects
child-projects
. Assim, você usa a<dependencyManagement>
seção para declarar todas as dependências que você usará nas suas diferenteschild-projects
. O mais importante é que, nesta seção, você defina um<version>
para não precisar declará-lo novamente no seuchild-project
.O
<dependencyManagement>
ponto de vista do meu ponto de vista (corrija-me se estiver errado) é útil, ajudando você a centralizar a versão de suas dependências. É como um tipo de recurso auxiliar.fonte
No Eclipse, há mais um recurso no
dependencyManagement
. Quandodependencies
é usado sem ele, as dependências não encontradas são observadas no arquivo pom. SedependencyManagement
for usado, as dependências não resolvidas permanecerão despercebidas no arquivo pom e os erros aparecerão apenas nos arquivos java. (importações e tais ...)fonte
A diferença entre os dois é melhor apresentada no que parece ser uma definição necessária e suficiente do elemento dependencyManagement disponível nos documentos do site do Maven:
dependencyManagement
"Informações de dependência padrão para projetos que herdam deste. As dependências nesta seção não são resolvidas imediatamente. Em vez disso, quando um POM derivado deste declara uma dependência descrita por groupId e artifactId correspondentes, a versão e outros valores desta seção são usados para essa dependência se ainda não foram especificados ". [ https://maven.apache.org/ref/3.6.1/maven-model/maven.html ]
Deve ser lido junto com mais informações disponíveis em uma página diferente:
“..O conjunto mínimo de informações para combinar uma referência de dependência com uma seção dependencyManagement é realmente {groupId, artifactId, type, classifier}. Em muitos casos, essas dependências se referem a artefatos de jar sem classificador. Isso nos permite abreviar a identidade definida como {groupId, artifactId}, já que o padrão para o campo type é jar e o classificador padrão é nulo. ” [ https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html ]
Portanto, todos os subelementos (escopo, exclusões etc.) de um elemento de dependência - exceto groupId, artifactId, tipo, classificador, e não apenas versão - estão disponíveis para bloqueio / padrão no ponto (e, portanto, herdados de daí em diante), você especifica a dependência dentro de um dependencyElement. Se você especificou uma dependência com os subelementos type e classifier (consulte a página da Web citada pela primeira vez para verificar todos os subelementos) como jar e not null, respectivamente, seria necessário {groupId, artifactId, classifier, type} referenciar (resolver) essa dependência em qualquer ponto de uma herança originária do elemento dependencyManagement. Caso contrário, {groupId, artifactId} seria suficiente se você não pretender substituir os padrões de classificador e tipo (jar e null, respectivamente). Portanto, o padrão é uma boa palavra-chave nessa definição; qualquer subelemento (s) (exceto groupId,
Portanto, qualquer elemento de dependência fora do dependencyManagement, seja como referência a algum elemento dependencyManagement ou como autônomo, é imediatamente resolvido (ou seja, instalado no repositório local e disponível para caminhos de classe).
fonte