Diferencia entre la compilación del alcance de Maven y el empaquetado JAR proporcionado

Resuelto emstol asked hace 13 años • 7 respuestas

¿Cuál es la diferencia entre el alcance de Maven compiley providedcuando el artefacto se construye como un JAR? Si fuera GUERRA, lo entendería: el artefacto se incluiría 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 alcance es compileo provided. Sé que providedlas dependencias no son transitivas, pero ¿es sólo una diferencia?

emstol avatar Jul 11 '11 14:07 emstol
Aceptado

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 aplicación web, si el servidor de la aplicación ya proporciona el JAR (o su funcionalidad), utilice "proporcionado"; de lo contrario, utilice "compilar".

Aquí está la referencia.

Owen Cao avatar Sep 11 '2014 01:09 Owen Cao

Del documento Maven :

  • compilar

    Este es el ámbito predeterminado, que se utiliza si no se especifica ninguno. Las dependencias de compilación están disponibles en todas las rutas de clase de un proyecto. Además, esas dependencias se propagan a proyectos dependientes.

  • proporcionó

    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 la ruta de clase de compilación y prueba y no es transitivo.

Resumen:

  • las dependencias no son transitivas (como mencionaste)
  • El alcance proporcionado solo está disponible en la ruta de clase de compilación y prueba, mientras que el alcance de compilación está disponible en todas las rutas de clase.
  • las dependencias proporcionadas no están empaquetadas
Jacob avatar Jul 11 '2011 07:07 Jacob

Si planea generar un único archivo JAR con todas sus dependencias (el típico xxxx-all.jar), entonces el alcance proporcionado es importante, porque las clases dentro de este alcance no se empaquetarán en el JAR resultante.

Consulte el complemento maven-assembly para obtener más información.

jfcorugedo avatar Jul 23 '2014 13:07 jfcorugedo