Исключить пустые каталоги с помощью Jar Jar Links

Я использую задачу Ant из Jar Jar Links для встраивания классов из стороннего jar-файла (objenesis) в свой распространяемый jar-файл (example.jar). Jar Jar переведет классы из оригинального пакета (org.objenesis) в один из моих вариантов.

Это работает, но он оставляет пустые каталоги в распространяемом фляге.

Вот упрощенный build.xml:

<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="org.thirdparty.@1"/>
    </jarjar>
</target>   

Пример содержимого файла example.jar включает (как и ожидалось):

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

но также эти пустые каталоги (нежелательно):

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

Мой вопрос: как мне исключить эти пустые каталоги?

Я попробовал опцию "zap" ( указана в документе), но это не сработало.

1 ответ

Решение

Похоже, это известная проблема в Jar Jar, перечисленная в их трекере: http://code.google.com/p/jarjar/issues/detail?q=empty&id=32

Учитывая, что это было поднято почти три года назад и, похоже, не имело никакой тяги, я полагаю, у вас есть возможность внести исправление или обойти его.

Примером цели Ant для ее решения, использующей поддержку Ant для удаления пустых каталогов при копировании, будет:

<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="com.example.my-app.jarjar.com.example.dependency.@1"/>
    </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>

Это немного шероховатый, но он достигает того, что вы хотите.

Другие вопросы по тегам