tutorial que proyecto pom estructura español desde crear consola comandos maven jar

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



maven tutorial español (6)

¿Cuál es la diferencia entre la compile alcance de compile y la que se 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 dependencias provided no son transitivas, pero ¿es solo una diferencia?


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

Proporcionado significa que necesita el JAR para compilar, pero en el tiempo de ejecución ya existe un JAR proporcionado por el entorno para que no lo necesite 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 aplicaciones ya proporciona el JAR (o su funcionalidad), use "proporcionado" de lo contrario use "compilar".

Aquí está la referencia.


  • compilar

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

  • previsto

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 tarro (es decir, jar ejecutable, etc.)


Aquí está el informe sobre todas las dependencias admitidas ( documento de Source Maven )

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.

previsto

Esto es muy parecido a compilar, 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, establecería 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 la compilación y prueba classpath, y no es transitivo.

tiempo de ejecución

Este alcance indica que la dependencia no es necesaria para la compilación, pero es para la ejecución. Se encuentra en el entorno de ejecución y en la prueba de las rutas de clase, pero no en la compilación de la ruta de clases.

prueba

Este alcance 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 la prueba. Este alcance no es transitivo.

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 ámbito solo es compatible con una dependencia de tipo pom en la sección. Indica la dependencia que se debe reemplazar con la lista efectiva de dependencias en la sección de 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.


Del doc. Maven :

  • 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.

  • previsto

    Esto es muy parecido a compilar, 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, establecería 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 la compilación y prueba classpath, y no es transitivo.

Resumen:

  • Las dependencias no son transitivas (como usted mencionó)
  • el ámbito proporcionado solo está disponible en la compilación y prueba classpath, mientras que el alcance de compilación está disponible en todas las classpaths.
  • Las dependencias proporcionadas no están empaquetadas.

Para un archivo jar, la diferencia está en la ruta de clase que figura en el archivo MANIFEST.MF incluido en el archivo jar si addClassPath se establece en true en la configuración de maven-jar-plugin. Las dependencias ''compilar'' aparecerán en el manifiesto, las dependencias ''proporcionadas'' no aparecerán.

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


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

Ver Maven-assembly-plugin para más información.