¿Cuál es la diferencia entre estos ámbitos de dependencia de Maven: proporcionado/compilar/sistema/importar?
He leído la documentación y tengo cierta comprensión.
Por favor corríjame o infórmeme de la verdad; según tengo entendido:
provided
Las dependencias deben estar en la máquina en la que ejecuta el código y deben incluirse en la rutacompile
Las dependencias no estarán en la máquina que ejecuta el código, así que inclúyalas en la compilación.system
Exactamente lo mismo que se proporciona, pero necesita que las dependencias estén estrictamente presentes en un archivo jar.import
Parece que debería importar las dependencias de algún otro archivo POM, pero no sé cómo ni por qué, por lo que agradecería un poco de explicación.
Proporcionado significa: "Este archivo jar debe compilarse localmente, pero otra cosa lo proporcionará en el classpath durante el tiempo de ejecución, así que no lo incluya en el classpath por mí". Por ejemplo, todos los contenedores web (p. ej.: tomcat) incluyen archivos jar para servlets. Debería utilizar provided
for las clases de servlet para poder compilar su código localmente, pero no desea anular las clases de servlet que Tomcat le proporciona cuando implementa en él.
system
significa "Estas dependencias están en mi sistema y quiero señalarlas directamente". Desea evitar esto si puede, porque otra persona en otra computadora no necesariamente tendrá estas dependencias.
La diferencia entre provided
es más fácil de mostrar:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
¿Ves cómo tiene eso <systemPath>
? Esa es la diferencia. No especifica la ruta con provided
, siempre que sepa cómo obtener la dependencia de un repositorio. system
lo obtiene únicamente de su sistema de archivos.
Ni siquiera he oído hablar de import
. @JigarJoshi vinculado a http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html que dice
importar (solo disponible en Maven 2.0.9 o posterior)
Este alcance solo se usa en una dependencia de tipo pom en la
<dependencyManagement>
sección. Indica que el POM especificado debe reemplazarse con las dependencias en la sección de ese POM. Dado que son reemplazadas, las dependencias con un alcance de importación en realidad no participan en la limitación de la transitividad de una dependencia.
Creo que esto quiere decir "tome todas las dependencias que tiene este proyecto e inclúyalas en esta <dependencyManagement>
sección". Que alguien me corrija si me equivoco.