¿Cuál es la diferencia entre el alcance de Maven compile
y provided
cuando el artefacto se construye como un JAR? Si fuera WAR, 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 compile
o provided
. Sé que las provided
dependencias no son transitivas, pero ¿es solo una diferencia?
260
JAR packaging
contexto. Maven doc no lo menciona. Uso Maven por un tiempo, pero ya me he preguntado sobre eso :) Entonces parece que enJAR packaging
contexto, no hay ninguna diferencia entrecompile
yprovided
(excepto la transición de dependencia). Estoy en lo cierto?compile
y no lo será si el alcance esprovided
.Aquí está la referencia.
fuente
mvn exec:java
se ejecuta, pero sí una dependencia compilada.Si planea generar un solo archivo JAR con todas sus dependencias (el típico xxxx-all.jar), entonces el alcance es importante, porque las clases dentro de este alcance no se incluirán en el JAR resultante.
Ver maven-assembly-plugin para más información
fuente
maven-assembly-plugin
, interesante que las respuestas más votadas no lo mencionen.Póngalo a disposición en la ruta de clase, no agregue esta dependencia al jar final si es un jar normal; pero agregue este jar al jar si el jar final es un jar individual (por ejemplo, jar ejecutable)
La dependencia estará disponible en el entorno de tiempo de ejecución, así que no agregue esta dependencia en ningún caso; incluso no en un solo jar (es decir, jar ejecutable, etc.)
fuente
Para un archivo jar, la diferencia está en el classpath listado en el archivo MANIFEST.MF incluido en el jar si addClassPath se establece en verdadero en la configuración de maven-jar-plugin. las dependencias 'compilar' aparecerán en el manifiesto, las dependencias 'provistas' no lo harán.
Una de mis manías es que estas dos palabras deben tener el mismo tiempo. Ya sea compilado y proporcionado, o compilado y proporcionado.
fuente
Cuando configura el alcance
provided
de Maven como , significa que cuando se ejecuta el complemento, la versión de dependencias real utilizada dependerá de la versión de Apache Maven que haya instalado.fuente
Si el archivo jar es como el archivo jar ejecutable spring boot, el alcance de todas las dependencias debe
compile
incluir todos los archivos jar.Pero si el archivo jar se usa en otros paquetes o aplicaciones, entonces no es necesario incluir todas las dependencias en el archivo jar porque estos paquetes o aplicaciones pueden proporcionar otras dependencias por sí mismos.
fuente