2009-03-16 13 views
60

no puedo encontrar ninguna explicación detallada de conf atributo de la etiqueta de la dependencia de la hiedra:¿Alguien puede explicar el atributo conf de la dependencia ivy.xml?

<dependency org="hibernate" name="hibernate" rev="3.1.3" conf="runtime, standalone -> runtime(*)"/> 

Ver que conf atributo? No encuentro ninguna explicación (que pueda entender) sobre el lado derecho del símbolo ->. TENGA en cuenta que no sé nada sobre Maven, así que explique este atributo con esa consideración.

Sí, ya he mirado en esto: http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html

Gracias,
Dan

+0

Se agregaron más detalles, como se solicitó – VonC

Respuesta

69

En primer lugar, Ivy is not Maven;)
Maven2 es una herramienta de gestión de proyectos de software y comprensión, mientras que Ivy es solo una herramienta de administración de dependencias.

Ivy depende en gran medida de un concepto único llamado configuración.
En hiedra, una configuración de módulo es una forma de usar o para ver el módulo.
Por ejemplo, puede tener una configuración de prueba y tiempo de ejecución en su módulo. Pero también puedes tener una configuración mysql y oracle. O una configuración hibernate y jdbc.

En cada configuración se puede declarar:

  • lo artefactos (frasco,, ... la guerra) son obligatorios.
  • sus dependencias en otros módulos, y describa qué configuración de la dependencia necesita. Esto se llama mapeo de configuración.

Así que el atributo conf hace precisamente eso: Describe una asignación de configuración para una dependencia.
El mapped child element es su "lado derecho del símbolo ->" y representa el nombre de la configuración de dependencia asignada. El comodín '*' se puede usar para designar todas las configuraciones de este módulo.


Maven2 en su lado tiene algo que se llama la alcance.
Puede declarar una dependencia como parte del alcance de la prueba o del ámbito de tiempo de compilación.
Luego, dependiendo de este alcance, obtendrá el artefacto de dependencia (solo un artefacto por módulo en maven2) con sus dependencias según su alcance. Los ámbitos están predefinidos en maven2 y no puede cambiar eso.

Eso significa:

Hay un montón de dependencias innecesarias descargados para muchas bibliotecas.
Por ejemplo, Hibernate descarga un montón de archivos JAR JBoss y la etiqueta de visualización descarga todos los archivos JAR de varios frameworks web. Me encontré excluyendo casi tantas dependencias como agregué.

El problema es que la hibernación se puede utilizar con varias implementaciones de caché, varios aplicación agrupación de conexiones, ... Y esto no puede ser controlada con alcances, configuraciones Ivy wheres ofrece una solución elegante a este tipo de problema.
Por ejemplo, en la hiedra, hibernación suponiendo que tiene un archivo de hiedra como éste, entonces se puede declarar una dependencia de esa manera:

<dependency org="hibernate" name="hibernate" rev="2.1.8" conf="default->proxool,oscache"/> 

conseguir hibernar con sus Proxool y OSCache implementaciones, y al igual que:

<dependency org="hibernate" name="hibernate" rev="2.1.8" conf="default->dbcp,swarmcache"/> 

para obtener hibernate con dbcp y swarmcache.

Mediante la cartografía de su configuración por defecto master a "proxool,oscache" o "dbcp,swarmcache", se especifica lo que necesita exactamente desde el módulo "Hibernate".


Puede encontrar a los "Proxool, ..." argumentos haciendo una lista de la configuración de la hiedra definido para cada asociado módulos con la biblioteca. Por ejemplo:

<ivy-module version="2.0"> 
<info organisation="ssn-src" module="pc"/> 
<configurations defaultconfmapping="default->default"> 
    <conf name="default" /> 
    <conf name="provided" description="they are provided by the env." /> 
    <conf name="compile" extends="default,provided" /> 
    <conf name="war" extends="default"/> 
</configurations> 
<dependencies> 

Example:

supongamos modA tiene dos configuraciones, defecto y prueba.
Como cuestión práctica, va a ser muy inusual querer omitir el atributo conf del elemento de dependencia.
El ivy.xml para modA podría tener una dependencia:

<dependency org="theteam" name="modB" rev="1.0" conf="default->*" /> 

estás empezando desde por defecto, en lugar de tanto de defecto y prueba.

El ejemplo anterior hace que el valor predeterminado de modA dependa de conf1, conf2 y conf3 de modB.
O puede que quiera decir que por defecto de Moda solo depende de conf1 de ModB:

<dependency org="theteam" name="modB" rev="1.0" conf="default->*conf1*" /> 
+5

Ok, creo que casi lo tengo. Pero, ¿dónde encuentras tus opciones? ¿Cómo sabías que puedes decir proxool, oscache/dbcp, swarmcache? –

+1

Que las "dependencias innecesarias descargadas" sean direccionables en Maven, a través de la exclusión de dependencias transitorias predeterminadas y la toma de decisiones explícitas. Pero seré el primero en admitir que de ningún modo es "elegante". – mezmo

+2

+1 para una respuesta muy clara; ver también http://ant.apache.org/ivy/history/latest-milestone/tutorial/conf.html –

13

Gracias VonC!

Me ayudó mucho más.

Cuando se trata de opciones (configuraciones) tieTYT, puede encontrarlas en el archivo ivy- [número de revisión] .xml en su repositorio Ivy en: nombre de la organización -> nombre del módulo.

Un ejemplo de elemento de configuraciones de la revisión JUnit 4.6 descargado de http://www.springsource.com/repository/app/.

<configurations> 
    <conf name="compile" visibility="public" description="Compile dependencies"/> 
    <conf name="optional" visibility="public" extends="compile" description="Optional dependencies"/> 
    <conf name="provided" visibility="public" description="Provided dependencies"/> 
    <conf name="runtime" visibility="public" extends="compile" description="Runtime dependencies"/> 
</configurations> 

En el archivo ivy.xml de mi proyecto, tengo una configuración compile-test.En el elemento de dependencias Tengo la siguiente dependencia:

<dependency org="org.junit" name="com.springsource.org.junit" 
     rev="4.6.0" conf="compile-test->compile" /> 

Como se puede ver, la configuración de mi prueba de compilación depende de la configuración de compilación en el archivo ivy.xml del JUnit.

+1

Falló completamente su respuesta allí. Buena ilustración. +1 – VonC

7

Me ayudó una vez para entender las cosas de esta manera:

  1. Una configuración de la hiedra es simplemente un nombre para algún subconjunto de objetos del módulo.
  2. Las dependencias entre los módulos se especifican en términos de nombres de configuración.
10

He leído estas respuestas y, francamente, no las encuentro muy útiles. Creo que podrían ser mejoradas por lo que escribieron cómo usar y entender configuraciones, mostrando un ejemplo práctico:

http://wrongnotes.blogspot.com/2014/02/simplest-explanation-of-ivy.html

Desafortunadamente, usted tiene que entender un poco acerca de experto y sus dependencias, porque Ivy está usando repositorios Maven para tirar esos archivos jar para que Ivy tenga que entender a Maven y te pasa ese dinero. Pero, creo que lo mantuve muy simple sin entrar en demasiados detalles sobre maven.

+0

artículo muy útil, podría ser agradable también este enlace, que explica los ámbitos Maven que necesita saber http://stackoverflow.com/questions/7104364/how-are-maven-scopes-mapped-to- hiedra-configuraciones-por-hiedra – pvgoddijn

Cuestiones relacionadas