Исключить пустые каталоги с помощью 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>
Это немного шероховатый, но он достигает того, что вы хотите.