2011-12-11 12 views
8

Estoy usando una tarea Ant desde Jar Jar Links para incrustar clases de un archivo jar de terceros (objenesis) en mi archivo jar distribuible (ejemplo.jar). Jar Jar traducirá las clases del paquete original (org.objenesis) a una de mi elección.Excluir directorios vacíos con Jar Jar Links

Funciona pero deja directorios vacíos en el contenedor distribuible.

Aquí es un build.xml simplificado:

<target name="jar" depends="compile"> 
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" 
     classpath="lib/jarjar-1.1.jar"/> 

    <jarjar jarfile="dist/example.jar" excludes="org.objenesis.**"> 
     <fileset dir="build/classes/main"/> 
     <zipfileset src="lib/objenesis-1.2.jar"/> 
     <rule pattern="org.objenesis.**" result="[email protected]"/> 
    </jarjar> 
</target> 

Una muestra de contenido de la example.jar incluye (como se esperaba):

org/thirdparty/Objenesis.class 
org/thirdparty/ObjenesisBase.class 

pero también estos directorios vacíos (indeseable e):

org/objenesis/ 
org/objenesis/instantiator/ 
org/objenesis/instantiator/basic/ 

Mi pregunta: cómo excluir estos directorios vacíos?

Probé la opción "zap" (listed in the doc), pero eso no funcionó.

Respuesta

7

Esto parece ser un problema conocido en Jar Jar, que aparece en su gestor de incidencias: http://code.google.com/p/jarjar/issues/detail?q=empty&id=32

Teniendo en cuenta que ésta se haya producido hace casi tres años y no parece haber conseguido ninguna tracción, supongo que sus opciones deben contribuir con una solución o evitarla.

Un ejemplo Ant para evitar que, aprovechando el apoyo de hormiga para eliminar directorios vacíos en la copia, sería:

<target name="unpolluted-jarjar" description="JarJars without empty directories"> 
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" classpath="${location.lib}/build/jarjar-1.2.jar"/> 
    <jarjar basedir="${location.classes}" destfile="${location.dist.binaries}/my-app.jar"> 
     <zipfileset src="${location.lib}/shipped/dependency.jar"/> 
     <rule pattern="com.example.dependency.**" result="[email protected]"/> 
    </jarjar> 
    <mkdir dir="${location.dist.binaries}/exploded"/> 
    <unzip src="${location.dist.binaries}/my-app.jar" dest="${location.dist.binaries}/exploded/my-app.jar"/> 
    <copy includeemptydirs="false" todir="${location.dist.binaries}/unpolluted/my-app.jar"> 
     <fileset dir="${location.dist.binaries}/exploded/my-app.jar"/> 
    </copy> 
    <jar destfile="${location.dist.binaries}/my-app-unpolluted.jar"> 
     <fileset dir="${location.dist.binaries}/unpolluted/my-app.jar"/> 
    </jar> 
</target> 

Es un poco sucio, pero logra lo que quiere .

+0

Esto pareció funcionar para mí (tuve que convertir a sintaxis de Gradle). –