8

我正在使用来自Jar Jar Links的 Ant 任务将来自第 3 方 jar 文件(objenesis)的类嵌入到我的可分发 jar 文件(example.jar)中。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”选项(在文档中列出),但没有奏效。

4

1 回答 1

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>

它有点蹩脚,但它实现了你想要的。

于 2012-04-06T12:12:13.020 回答