que - maven tutorial español pdf
Cuál es la diferencia entre estos ámbitos de dependencia de Maven: provided/compile/system/import (2)
He leído la documentación y entiendo algo.
Por favor corrígeme o infórmame de la verdad; según mi entendimiento:
provided
Las dependencias deben estar en la máquina donde ejecutas el código, y deben estar incluidas en la rutacompile
Las dependencias no estarán en la máquina que ejecuta el código, así que inclúyalos en la compilaciónsystem
Exactamente igual a la proporcionada, pero necesita que las dependencias estén presentes en un archivo jar estrictamenteimport
Parece que debería importar las dependencias de algún otro archivo POM pero no sé cómo / por qué, así que un poco de elaboración sería apreciada
Encuentre el significado exacto de los ámbitos en Maven
Me referí a Maven maven.apache.org/guides/introduction/…
El ámbito de dependencia se usa para limitar la transitividad de una dependencia y también para afectar la classpath usada para varias tareas de compilación.
Hay 6 ámbitos disponibles:
compilar
Este es el alcance 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.
provisto :
Esto es muy similar a la compilación, 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 de Servlet y las API de Java EE relacionadas en 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 ámbito indica que la dependencia no es necesaria para la compilación, pero es para la ejecución. Está en los classpaths de tiempo de ejecución y de prueba, pero no en el classpath de compilación.
prueba :
Este á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.
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.
importar (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 son reemplazados, las dependencias con un alcance de importación en realidad no participan en la limitación de la transitividad de una dependencia.
Estás equivocado / ambiguo acerca de lo provided
. Significa que "Este jar debe compilarse localmente, pero se proporcionará en el classpath por otra cosa durante el tiempo de ejecución, así que no lo incluyas en el classpath". Por ejemplo, todos los contenedores web (p. Ej .: Tomcat) incluyen los contenedores para servlets. Debe utilizar las clases de servlet provided
para que pueda compilar su código localmente, pero no desea anular las clases de servlet que tomcat proporciona para usted cuando se 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 ese <systemPath>
? Esa es la diferencia. No especifica la ruta con la que se provided
, siempre que sepa cómo obtener la dependencia de un repositorio. system
obtiene solo de su sistema de archivos.
Nunca he oído hablar de import
. @JigarJoshi vinculado a maven.apache.org/guides/introduction/… 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 sección
<dependencyManagement>
. Indica que el POM especificado debe reemplazarse con las dependencias en la sección de ese POM. Dado que son reemplazados, 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 está diciendo: "tome todas las dependencias que este proyecto tiene y escríbalas en esta sección <dependencyManagement>
". Que alguien me corrija si me equivoco.