English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Uma característica central do Maven é a gestão de dependências. Quando lidamos com projetos de múltiplos módulos (que contêm centenas ou milhares de módulos ou subprojetos), as dependências entre módulos tornam-se muito complexas e a gestão se torna difícil. Para esse caso, o Maven oferece um método de controle altamente eficaz.
Uma situação comum, por exemplo, A depende de outra biblioteca B. Se outro projeto C quiser usar A, o projeto C também precisará usar a biblioteca B.
O Maven pode evitar a necessidade de procurar todas as bibliotecas necessárias. O Maven lê o arquivo do projeto (pom.xml) para encontrar as dependências entre os projetos.
Tudo o que precisamos fazer é definir bem as dependências diretas em cada pom do projeto. Outras coisas, o Maven nos ajudará a resolver.
Através da dependência transitiva, o gráfico de todas as bibliotecas incluídas cresce rapidamente. Quando há bibliotecas repetidas, as situações possíveis continuarão a aumentar. O Maven oferece algumas funções para controlar o grau de dependência transitiva.
Função | Descrição da função |
---|---|
Ajuste de dependência | Decidir qual versão de dependência será usada quando várias versões criadas manualmente aparecerem ao mesmo tempo. Se duas versões de dependência tiverem a mesma profundidade na árvore de dependência, a primeira declarada será usada. |
Este escopo é usado apenas quando a dependência é definida em um arquivo pom. Ao mesmo tempo, as dependências definidas na seção <dependencies> do arquivo POM do projeto atual podem substituir um POM específico. | 直接的指定手动创建的某个版本被使用。例如当一个工程 C 在自己的依赖管理模块包含工程 B,即 B 依赖于 A, 那么 A 即可指定在 B 被引用时所使用的版本。 |
Qualquer dependência transitiva pode ser marcada como opcional, usando o elemento "optional". Por exemplo: A depende de B, B depende de C. Portanto, B pode marcar C como opcional, então A pode não usar C. | Especificação direta de uma versão manualmente criada. Por exemplo, quando um projeto C contém o projeto B em seu módulo de gestão de dependências, ou seja, B depende de A, então A pode especificar a versão usada quando B for referenciado. |
Incluídas nas etapas de construção de cada fase. | Dependência excluída |
Qualquer dependência transitiva pode ser excluída usando o elemento "exclusion". Por exemplo, A depende de B, B depende de C. Portanto, A pode marcar C como "excluído". | Dependência opcional |
Escopo de dependência
A descoberta de dependências transitivas pode ser limitada usando os seguintes escopos de dependência: | Escopo |
---|---|
Descrição | Fase de compilação |
Este escopo indica que as dependências relacionadas são válidas apenas na classe do caminho do projeto. Valor padrão. | Fase de distribuição |
Este escopo indica que as dependências relacionadas são fornecidas pelo JDK de execução ou pelo servidor da web. | Fase de execução |
Este escopo indica que as dependências relacionadas não são necessárias na fase de compilação, mas são necessárias na fase de execução. | Fase de teste |
Este escopo indica que as dependências relacionadas estão apenas nas fases de compilação de teste e execução. | Fase do sistema |
Este escopo indica que você precisa fornecer um caminho de sistema. | Fase de importação |
Gestão de dependências
Geralmente, em um projeto comum, há uma série de projetos. Neste caso, podemos criar um arquivo pom de dependência público, que contém todas as dependências públicas, chamado de pai do pom de outros subprojetos. Um exemplo subsequente pode ajudá-lo a entender melhor este conceito.
App-UI-A seguir, detalhamento do gráfico de dependências acima:-Core-lib e App-Data-WAR depende de App
A Raiz é lib.-Core-lib e App-Data-o projeto pai de lib.
A Raiz define Lib em sua seção de dependências.1、lib2 e Lib3 como dependência.
App-UI-O código do arquivo pom.xml da WAR é o seguinte:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</<groupId> <artifactId>App-UI-WAR</<artifactId> <version>1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname</<groupId> <artifactId>App-Core-lib</<artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname</<groupId> <artifactId>App-Data-lib</<artifactId> <version>1.0</version> </dependency> </dependencies> </project>
App-Core-O código do arquivo pom.xml de lib é o seguinte:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>Root</<artifactId> <groupId>com.companyname.groupname</<groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</<groupId> <artifactId>App-Core-lib</<artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
App-Data-O código do arquivo pom.xml de lib é o seguinte:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>Root</<artifactId> <groupId>com.companyname.groupname</<groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</<groupId> <artifactId>App-Data-lib</<artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
O código do arquivo pom.xml da Raiz é o seguinte:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</<groupId> <artifactId>Root</<artifactId> <version>1.0</version> <packaging>pom</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname1</<groupId> <artifactId>Lib1</<artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname2</<groupId> <artifactId>Lib2</<artifactId> <version>2.1</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname3</<groupId> <artifactId>Lib3</<artifactId> <version>1.1</version> </dependency> </dependencies> </project>
Agora, quando construímos App-UI-Ao construir um projeto WAR, o Maven encontrará todas as dependências ao percorrer o gráfico de dependências e construirá a aplicação.
Através do exemplo acima, podemos aprender os seguintes conceitos-chave:
As dependências públicas podem ser unificadas usando o conceito de pai pom. App-Data-lib e App-Core-As dependências do projeto lib estão listadas no Projeto Root (refira o tipo de pacote do Root, que é um POM).
Não há necessidade de declarar a dependência da lib no App-UI-W declara Lib1, lib2, Lib3 É sua dependência. O Maven realiza esse detalhe através do mecanismo de dependências passíveis de transmissão.