Diferencia entre maven scope compile y proporcionado para el empaque de TARROS


¿Cuál es la diferencia entre el ámbito maven compile y provided cuando el artefacto se construye como un FRASCO? Si fuera la GUERRA, entendería que el artefacto estaría incluido o no en WEB-INF/lib. Pero en el caso de un JAR no importa-las dependencias no están incluidas. Tienen que estar en classpath cuando su ámbito es compile o provided. Sé que provided las dependencias no son transitivas, pero ¿es solo una diferencia?

 205
Author: Lonely Neuron, 2011-07-11

6 answers

Del Maven Doc :

  • Compile

    Este es el ámbito predeterminado, utilizado si no se especifica ninguno. Compilar las dependencias están disponibles en todos los classpaths de un proyecto. Además, esas dependencias se propagan a proyectos dependientes.

  • Proporcionado

    Esto es muy parecido a compile, pero indica que espera que el JDK o un contenedor para proporcionar la dependencia en tiempo de ejecución. Por ejemplo, cuando construyendo una aplicación web para la Java Enterprise Edition, lo haría establezca la dependencia de la API de Servlet y las API de Java EE relacionadas en ámbito proporcionado porque el contenedor web proporciona esas clases. Este scope solo está disponible en la ruta de clase de compilación y prueba, y es no transitiva.

Recapitulación:

  • las dependencias no son transitivas (como mencionaste)
  • el ámbito proporcionado solo está disponible en la ruta de clase de compilación y prueba, mientras que el ámbito de compilación está disponible en todos los classpaths.
  • las dependencias proporcionadas no están empaquetadas
 230
Author: Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-27 03:47:53

Compilar significa que necesitas el JAR para compilar y ejecutar la aplicación. Para una aplicación web, por ejemplo, el JAR se colocará en el directorio WEB-INF/lib.

Proporcionado significa que necesita el JAR para compilar, pero en tiempo de ejecución ya hay 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 web aplicación, si el servidor de aplicaciones ya proporciona el JAR (o su funcionalidad), entonces use "proporcionado" de lo contrario use "compilar".

Aquí está la referencia.

 239
Author: Owen Cao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-15 07:44:37

Si está planeando generar un solo archivo JAR con todas sus dependencias (el típico xxxx-all.jar), entonces el ámbito proporcionado importa, porque las clases dentro de este ámbito no serán paquetes en el JAR resultante.

Ver maven-assembly-plugin para más información

 13
Author: jfcorugedo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-23 13:42:23

Aquí está el resumen de todas las dependencias soportadas (source maven doc)

Compilar

Este es el ámbito predeterminado, utilizado 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.

Proporcionado

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

Tiempo de ejecución

Este ámbito indica que la dependencia no es necesaria para la compilación, sino para la ejecución. Está en los classpaths de runtime y test, pero no en el classpath de compile.

Prueba

Esto ámbito 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 pruebas. Este alcance no es transitivo.

Sistema

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

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

Este ámbito solo se admite en un dependencia del tipo pom en la sección. Indica la dependencia que se reemplazará con la lista efectiva de dependencias en la sección POM especificada. Dado que se reemplazan, las dependencias con un alcance de importación no participan realmente en la limitación de la transitividad de una dependencia.

 12
Author: Indra Uprade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-27 03:48:44
  • compilar

Hacer disponible en ruta de clase, no agregue esta dependencia en jar final si es jar normal; pero agregue este jar en jar si jar final es un solo jar (por ejemplo, jar ejecutable)

  • proporcionado

La dependencia estará disponible en el entorno de tiempo de ejecución, por lo que no agregue esta dependencia en ningún caso; incluso no en un solo jar (es decir, jar ejecutable, etc.)

 8
Author: Vijay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-17 05:59:35

Para un archivo jar, la diferencia está en la ruta de clase listada en el MANIFIESTO.Archivo MF incluido en el jar si addClassPath se establece en true en la configuración del maven-jar-plugin. las dependencias' compile ' aparecerán en el manifiesto, las dependencias 'provided' no.

Una de mis manías es que estas dos palabras deben tener el mismo tiempo. Compilado y proporcionado, o compilar y proporcionar.

 3
Author: Rick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-11 20:11:40