Исключить пустые каталоги с помощью Jar Jar Links - PullRequest
8 голосов
/ 11 декабря 2011

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

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

Вот упрощенная сборка.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 Ответ

7 голосов
/ 06 апреля 2012

Это, похоже, известная проблема в 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>

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

...