¿Para qué sirve <scope> bajo <dependency> en pom.xml?

Respuestas:

266

El <scope>elemento puede tomar 6 valores: compilación , proporcionado , tiempo de ejecución , prueba , sistema e importación .

Este alcance se usa para limitar la transitividad de una dependencia, y también para afectar el classpath usado para varias tareas de compilación.

compilar

Este es el alcance predeterminado, que se usa si no se especifica ninguno. Las dependencias de compilación están disponibles en todos los classpaths de un proyecto. Además, esas dependencias se propagan a proyectos dependientes.

previsto

Esto es muy parecido a la compilación, pero indica que espera que el JDK o un contenedor proporcionen la dependencia en tiempo de ejecución. Por ejemplo, al crear una aplicación web para Java Enterprise Edition, establecería la dependencia de la API de Servlet y las API de Java EE relacionadas con el alcance proporcionado porque el contenedor web proporciona esas clases. Este alcance solo está disponible en el classpath de compilación y prueba, y no es transitivo.

tiempo de ejecución

Este alcance indica que la dependencia no es necesaria para la compilación, sino para la ejecución. Está en el tiempo de ejecución y en las rutas de prueba, pero no en la ruta de compilación.

prueba

Este alcance indica que la dependencia no es necesaria para el uso normal de la aplicación, y solo está disponible para las fases de compilación y ejecución de prueba.

sistema

Este alcance es similar al proporcionado, excepto que debe proporcionar el JAR que lo contiene explícitamente. El artefacto siempre está disponible y no se busca en un repositorio.

importación (solo disponible en Maven 2.0.9 o posterior)

Este alcance solo se usa en una dependencia de tipo pom en la sección. Indica que el POM especificado debe reemplazarse con las dependencias en la sección de ese POM. Dado que se reemplazan, las dependencias con un alcance de importación en realidad no participan en limitar la transitividad de una dependencia.

Para responder la segunda parte de su pregunta:

¿Cómo podemos usarlo para ejecutar la prueba?

Tenga en cuenta que el testalcance permite usar dependencias solo para la fase de prueba.

Lea la documentación para más detalles.

Ortomala Lokni
fuente
Entonces, si usa "prueba", ¿termina en el archivo .jar creado?
markthegrea
1
¿Qué pasa si se necesita una dependencia en compilación y tiempo de ejecución?
Albin
23

se agregaron buenas imágenes con ámbitos explicativos

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Vaquar Khan
fuente
12

Seis ámbitos de dependencia:

  • compilar : alcance predeterminado, classpath está disponible para ambos src/mainysrc/test
  • prueba : classpath está disponible parasrc/test
  • proporcionado : como complie pero proporcionado por JDK o un contenedor en tiempo de ejecución
  • tiempo de ejecución : no se requiere para la compilación solo se requiere en tiempo de ejecución
  • sistema : proporcionado localmente proporciona classpath
  • importar : solo puede importar otros POM en el <dependencyManagement/>, solo disponible en Maven 2.0.9 o posterior
Premraj
fuente
4

La etiqueta de alcance siempre se usa para limitar las dependencias transitivas y la disponibilidad del jar a nivel de ruta de clase. Si no proporcionamos ningún alcance, el alcance predeterminado funcionará, es decir, compilar .

Mukesh
fuente
11
Compilar significa que necesita el JAR para compilar y ejecutar la aplicación. Para una aplicación web, como ejemplo, el JAR se colocará en el directorio WEB-INF / lib. Proporcionado significa que necesita el JAR para la compilación, pero en el tiempo de ejecución ya existe un JAR proporcionado por el entorno, por lo que no lo necesita empaquetado con su aplicación. Para una aplicación web, esto significa que el archivo JAR no se colocará en el directorio WEB-INF / lib. Para una aplicación web, si el servidor de aplicaciones ya proporciona el JAR (o su funcionalidad), use "proporcionado" o use "compilar".
Mukesh
1
agregue su comentario dentro de su respuesta
Supun Wijerathne
0

Si no proporcionamos ningún alcance, el alcance predeterminado es compilar. Si desea confirmar, simplemente vaya a la pestaña Efectivo pom en el editor de eclipses, se mostrará como compilación.

Umanath
fuente
OP preguntó cuál es el alcance es y hace , al no encontrar lo que es el ámbito predeterminado.
Wouter