2010-01-16 5 views
6

Mi objetivo es que mi script de compilación ant construya un archivo war e incluya los archivos de los que hiedra sabe que depende este proyecto. El mejor código que podía llegar a por el momento es el siguienteCómo usar hiedra para construir una guerra sin copiar tarros en un directorio lib

<mkdir dir="dist/lib"/> 
<ivy:retrieve pattern="dist/lib/[artifact].[ext]" sync="true"/> 
<war destfile="dist/${ivy.module}.war" basedir="build" includes="**/*.class" 
    webxml="${war.webxml}"> 
    <fileset dir="${war.web}"/> 
    <lib dir="dist/lib"/> 
</war> 

El problema con este código es copia los tarros dos veces. Una vez en mi directorio dist/lib y de nuevo en la guerra cuando se crea. Funciona, pero no puedo sacudir la sensación de que hay una mejor manera.

Lo que me gustaría hacer es algo más parecido a la siguiente

<ivy:cachepath pathid="locpathref.classpath"/> 
<war destfile="dist/${ivy.module}.war" basedir="build" includes="**/*.class" 
    webxml="${war.webxml}"> 
    <fileset dir="${war.web}"/> 
    <lib refid="locpathref.classpath"/> 
</war> 

El problema es que la etiqueta lib no toma en un refid de ningún tipo. ¿Alguna idea o estoy atrapado con un conjunto adicional de copias de archivos?

+0

Uso entonces la etiqueta lib funcionará como se espera –

Respuesta

4

El problema aquí es que el lib etiqueta es una costumbre conjunto de archivos que se dirige a sus archivos en el directorio lib sub del Archivo de la Guerra. Es posible escribir una tarea personalizada war pero no creo que valga la pena.

Si desea mejorar la manera en que hiedra gestiona las dependencias de su guerra, ¿le sugiero que use configuraciones?

crear una configuración de la descripción de las dependencias en tiempo de ejecución:

<ivy-module version="2.0"> 
    <info organisation="apache" module="hello-ivy"/> 
    <configurations> 
     <conf name="build" description="Libraries needed to for compilation"/> 
     <conf name="war" extends="build" description="Libraries that should be included in the war file" /> 
    </configurations> 
    <dependencies> 
     <dependency org="commons-lang" name="commons-lang" rev="2.0" conf="build->*,!sources,!javadoc"/> 
     <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="build->*,!sources,!javadoc"/> 
    </dependencies> 
</ivy-module> 

Posteriormente vez descargados en un directorio específico (usando un patrón) que se puede incluir el simple uso de la etiqueta lib la guerra de tarea:

<ivy:retrieve pattern="${lib.dir}/[conf]/[artifact].[ext]"/> 

    <war destfile="${war.file}" webxml="${resources.dir}/web.xml"> 
     <fileset dir="${resources.dir}" excludes="web.xml"/> 
     <lib dir="${lib.dir}/war"/> 
    </war> 

la ventaja de este enfoque es que se utiliza la hiedra conf atributo de cada proyecto de dependencia para decidir en última instancia si el jar se incluye o no dentro del archivo war. El archivo de compilación ya no le importa.

En conclusión, entiendo que el objetivo de su publicación fue la preocupación por las copias múltiples de sus archivos jar ... Usar mi enfoque sugerido multiplicará aún más sus copias, pero yo diría que esto no es un problema siempre que tenga una limpiar objetivo para eliminarlos después.

+0

Estoy de acuerdo en que esta es una solución mejor que lo que estoy haciendo, pero aún no elimina la copia de archivo adicional como me gustaría. Cuanto más lo veo, más pienso que, como dijiste, la única manera real de solucionarlo es creando una tarea de guerra personalizada o incluso una nueva tarea de lib personalizada para la tarea de guerra. En un mundo perfecto, esta nueva tarea podría convertirse en parte de Ivy o Ant. – AmaDaden

+2

La solución que desea es usar la tarea ivy cachefileset en lugar de cachepath. Entonces el parámetro refid a la etiqueta lib de warfile funcionará como se esperaba –

4

Si está utilizando Ant 1.8, puede utilizar la técnica descrita aquí: http://www.beilers.com/2010/06/ivy-dependency-management-lessons-learned-and-ant-1-8-mapped-resources/

Ejemplo:

<war destfile="${war.full.path}" webxml="WebContent/WEB-INF/web.xml" manifest="${manifest.path}"> 
    <fileset dir="WebContent"> 
    </fileset> 
    <classes dir="${build.dir}"/> 

    <mappedresources> 
     <restrict> 
     <path refid="classpath.CORE"/> 
     <type type="file"/> 
     </restrict> 
     <chainedmapper> 
     <flattenmapper/> 
     <globmapper from="*" to="WEB-INF/lib/*"/> 
     </chainedmapper> 
    </mappedresources> 

    <zipfileset dir="src" prefix="WEB-INF/classes"> 
     <include name="**/resources/**/*.properties" /> 
     <include name="**/resources/**/*.xml" /> 
    </zipfileset> 
</war> 
+0

Muy interesante ... ¡Intentaré esto e informaré! –

Cuestiones relacionadas