我正在使用Jar Jar Links中的Ant任务在我的可分发jar文件(example.jar)中嵌入来自第三方jar文件(objenesis)的类。 Jar Jar会将原始包(org.objenesis)中的类翻译成我选择的类。
它可以工作,但它会在可分发的jar中留下空目录。
这是一个简化的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”选项(listed in the doc),但这不起作用。
答案 0 :(得分:7)
这似乎是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>
它有点蹩脚,但它可以达到你想要的效果。