Ámbitos de dependencia de Maven

1. Introducción

Maven es una de las herramientas de construcción más populares en el ecosistema de Java y una de sus características principales es la gestión de dependencias.

En este artículo, describiremos y exploraremos el mecanismo que ayuda a administrar las dependencias transitivas en los proyectos de Maven: los ámbitos de dependencia.

2. Dependencia transitiva

En pocas palabras, hay dos tipos de dependencias en Maven directo y transitivo.

Las dependencias directas son las que se incluyen explícitamente en el proyecto. Estos se pueden incluir en el proyecto utilizando etiquetas:

 junit junit 4.12 

Las dependencias transitivas, por otro lado, son dependencias requeridas por nuestras dependencias directas. Maven incluye automáticamente las dependencias transitivas necesarias en nuestro proyecto.

Podemos enumerar todas las dependencias, incluidas las dependencias transitivas en el proyecto, usando: comando mvn dependency: tree .

3. Ámbitos de dependencia

Los ámbitos de dependencia pueden ayudar a limitar la transitividad de las dependencias y modifican la ruta de clases para diferentes tareas construidas. Maven tiene 6 ámbitos de dependencia predeterminados .

Y es importante comprender que cada ámbito, excepto la importación , tiene un impacto en las dependencias transitivas.

3.1. Compilar

Este es el ámbito predeterminado cuando no se proporciona ningún otro ámbito.

Las dependencias con este alcance están disponibles en la ruta de clases del proyecto en todas las tareas de compilación y se propagan a los proyectos dependientes.

Más importante aún, estas dependencias también son transitivas:

 commons-lang commons-lang 2.6 

3.2. Previsto

Este alcance se utiliza para marcar las dependencias que JDK o un contenedor deben proporcionar en tiempo de ejecución , de ahí el nombre.

Un buen caso de uso para este ámbito sería una aplicación web implementada en algún contenedor, donde el contenedor ya proporciona algunas bibliotecas.

Por ejemplo, un servidor web que ya proporciona la API de Servlet en tiempo de ejecución, por lo tanto, en nuestro proyecto, esas dependencias se pueden definir con el alcance proporcionado :

 javax.servlet servlet-api 2.5 provided 

Las dependencias proporcionadas están disponibles solo en tiempo de compilación y en la ruta de clases de prueba del proyecto; es más, no son transitivos.

3.3. Tiempo de ejecución

Las dependencias con este alcance son necesarias en tiempo de ejecución , pero no para la compilación del código del proyecto. Debido a eso, las dependencias marcadas con el alcance del tiempo de ejecución estarán presentes en el tiempo de ejecución y en la ruta de clases de prueba, pero no estarán en la ruta de clases de compilación.

Un buen ejemplo de dependencias que deberían usar el alcance del tiempo de ejecución es un controlador JDBC:

 mysql mysql-connector-java 6.0.6 runtime 

3.4. Prueba

Este alcance se usa para indicar que la dependencia no es necesaria en el tiempo de ejecución estándar de la aplicación, sino que solo se usa con fines de prueba. Las dependencias de prueba no son transitivas y solo están presentes para las rutas de clases de prueba y ejecución.

El caso de uso estándar para este alcance es agregar una biblioteca de prueba como JUnit a nuestra aplicación:

 junit junit 4.12 test 

3.5. Sistema

El alcance del sistema es muy similar al alcance proporcionado . La principal diferencia entre esos dos ámbitos es que el sistema requiere que apuntemos directamente a un jar específico en el sistema.

Lo importante a recordar es que la construcción del proyecto con dependencias del alcance del sistema puede fallar en diferentes máquinas si las dependencias no están presentes o están ubicadas en un lugar diferente al que apunta systemPath :

 com.baeldung custom-dependency 1.3.2 system ${project.basedir}/libs/custom-dependency-1.3.2.jar 

3.6. Importar

Este alcance se agregó en Maven 2.0.9 y solo está disponible para el tipo de dependencia pom . Hablaremos más sobre el tipo de dependencia en artículos futuros.

Import indica que esta dependencia debe reemplazarse con todas las dependencias efectivas declaradas en su POM:

 com.baeldung custom-project 1.3.2 pom import 

4. Alcance y transitividad

Cada ámbito de dependencia afecta a las dependencias transitivas a su manera. Esto significa que diferentes dependencias transitivas pueden terminar en el proyecto con diferentes alcances.

Sin embargo, las dependencias con alcances proporcionados y prueba nunca se incluirán en el proyecto principal.

Luego:

  • Para el alcance de compilación , todas las dependencias con alcance de tiempo de ejecución se incorporarán con el alcance de tiempo de ejecución , en el proyecto y todas las dependencias con el alcance de compilación se incorporarán con el alcance de compilación , en el proyecto.
  • Para el alcance proporcionado , tanto el tiempo de ejecución como las dependencias del alcance de compilación se incorporarán al alcance proporcionado , en el proyecto
  • Para el alcance de la prueba , tanto el tiempo de ejecución como las dependencias transitivas del alcance de compilación se incorporarán al alcance de la prueba , en el proyecto.
  • Para el tiempo de ejecución de alcance, tanto en tiempo de ejecución y compilación dependencias transitivas alcance se necesiten en el tiempo de ejecución de alcance, en el proyecto

5. Conclusión

En este tutorial rápido, nos enfocamos en los alcances de dependencia de Maven, su propósito y los detalles de cómo operan.

Si desea profundizar en Maven, la documentación es un excelente lugar para comenzar.