lunes, 22 de agosto de 2011

Iniciando con Maven Parte 3

Siguiendo con el post anterior, vamos a seguir posteando sobre maven:


Dependencias

Una dependencia es una referencia en el POM de la librería que se desea incluir en el proyecto. Por ejemplo si deseamos incluir la librería para el manejo de JUnit debemos declararlo de la siguiente manera:

  
     junit
     junit
     4.5
  


Como vimos, los objetos en el repositorio se identifican mediante 3 tags groupId:artifactId:version

Transitividad de dependencias

Con esto, nos referimos al hecho de que cada dependencia, incluye a su vez las dependencias que necesita. Por ejemplo, si agregamos la dependencia A, que a la vez depende de B, entonces B se incluirá sin la necesidad de explicitarlo.

Es muy importante tener siempre presente la transitividad, a la hora de detectar problemas de BUILD ERROR. Supongamos que agregamos la dependencia A, que a la vez depende de B, versión 1.0. Es muy probable que no seamos conscientes de esa transitividad, con lo cual, en algún momento podemos agregar en el pom, explícitamente, la dependencia B versión 2.0. Lo que ocurrirá, es que si en el código utilizamos features de la versión 2.0 que no están en la 1.0, entonces tendremos un BUILD ERROR. Esto es así, ya que maven le da prioridad a la transitividad.

Para estos casos, lo que tendremos que hacer cuando agregamos la dependencia A, es excluir la B, versión 1.0.

 	org.A
 	A
 	1.0
 	
 		
 			org.B
  	 		B
 		
 	


 	org.B
 	B
 	2.0
 

Scope de dependencia

Las dependencias tienen varios niveles o scopes, algunas hacen falta para compilar, otras solo para los test, algunas las va a incluir el contenedor.

Los scopes de las dependencias pueden ser utilizados para limitar o condicionar las dependencias transitivas. Existen seis tipos de scopes:

Compile: es el scope por defecto. Las dependencias están disponibles en el proyecto y en sus proyectos dependientes.
Provided: se espera que el JDK, la aplicación o el contenedor provean la dependencia.

Runtime: la dependencia no es requerida en tiempo de compilación pero sí para la ejecución.
Test: son dependencias que son requeridas solo cuando se compila y ejecuta los test.

System: similar a provided pero se le debe indicar el jar que contiene la dependencia.

Import: (a partir a la version 2.0.9) solo es usado en una dependencia del tipo POM en la sección . Indica que el POM utilizado debe ser remplazado con las dependencias que éste tenga en su sección.