从 jar 中删除文件的 ant 任务

Posted

技术标签:

【中文标题】从 jar 中删除文件的 ant 任务【英文标题】:ant task to remove files from a jar 【发布时间】:2011-02-01 01:11:26 【问题描述】:

如何编写一个从以前编译的 JAR 中删除文件的 ant 任务?

假设我的 JAR 中的文件是:

aaa/bbb/ccc/Class1
aaa/bbb/ccc/Class2
aaa/bbb/def/Class3
aaa/bbb/def/Class4

...我想要一个没有 aaa.bbb.def 包的 JAR 文件版本,我需要使用 ant 将其剥离,这样我最终得到一个包含以下内容的 JAR:

aaa/bbb/ccc/Class1
aaa/bbb/ccc/Class2

谢谢!

【问题讨论】:

【参考方案1】:

我不确定是否有适合您要求的直接解决方案。我建议将 jar 分解到某个临时目录,然后删除不需要的类文件。最后创建一个包含所需类文件的新 jar。

参考链接:

http://ant.apache.org/manual/Tasks/unzip.html

http://ant.apache.org/manual/Tasks/delete.html

http://ant.apache.org/manual/Tasks/jar.html

【讨论】:

【参考方案2】:

您必须解压缩并重新压缩。

<unzip src="myjar.jar" dest="/classes/">
<jar destfile="newjar.jar"
    basedir="/classes/"
    includes="**/*"
    excludes="**/def/*"
/>    

【讨论】:

【参考方案3】:

您是否尝试过使用zipfileset 任务?

<jar destfile="stripped.jar">
    <zipfileset src="full.jar" excludes="files/to/exclude/**/*.file"/>
</jar>

例如:

<property name="library.dir" value="dist"/>
<property name="library.file" value="YourJavaArchive.jar"/>
<property name="library.path" value="$library.dir/$library.file" />
<property name="library.path.new" value="$library.dir/new-$library.file"/>

<target name="purge-superfluous">
    <echo>Removing superfluous files from Java archive.</echo>

    <jar destfile="$library.path.new">
        <zipfileset src="$library.path" excludes="**/ComicSans.ttf"/>
    </jar>

    <delete file="$library.path" />
    <move file="$library.path.new" tofile="$library.path" />
</target>

【讨论】:

@mipadi 感谢您的回答!我希望有一种没有中间阶段的方法 - 直接从 Jar 中删除文件/文件夹。失败,我想这是我最接近它的地方! 仅供参考,可能大多数人都知道这一点,但我没有想到:-)。 “jar”任务将修改 JAR 的 MANIFEST.MF,这在我的情况下会导致问题。我刚刚将“manifest”属性添加到 jar 任务中,并将其指向我希望它使用的清单。很好的答案,绝对帮助了我,谢谢! 也可以使用zip 代替jar 以避免更改MANIFEST.MF【参考方案4】:

如果一个支持 jar 文件的归档程序,例如Linux上的“zip”,可用,任务可以通过

执行>

子树删除取决于所用归档器的功能。 Ant "exec" 任务的 "os" 属性允许在不同的操作系统上使用不同的归档器。

【讨论】:

【参考方案5】:

我来这里是想使用 ant 作为 gradle unzip 中的一些缺点的解决方法。

万一其他人在同一条船上。

这是一个例子:

    task antUnzip() << 

            ant.jar(destfile : "stripped.jar") 
                zipfileset (src : "full.jar", excludes : "files/to/exclude/**/*.file") 
                
            

【讨论】:

【参考方案6】:

答案对我来说并没有完全加起来 -

<zip destfile="tmp.jar">
        <zipfileset src="src.jar">
                <exclude name="**/*.class" />
        </zipfileset>
</zip>
<move file="tmp.jar" tofile="src.jar" /> 

这使用单次传递,不会为构建增加太多时间

来源:http://ant.1045680.n5.nabble.com/Remove-entru-from-ZIP-file-using-ANT-td1353728.html

【讨论】:

以上是关于从 jar 中删除文件的 ant 任务的主要内容,如果未能解决你的问题,请参考以下文章

Ant可以从两个目录中删除_identical_文件吗?

使用Apache Ant删除带有条件的文件

ant propertyfile task update property 删除属性文件中的所有注释

如何使用ant解压缩包含嵌套的zip文件?

ant中对文件和目录进行复制和删除

类路径中的某些运行时 JAR 文件的版本不兼容。考虑将它们从类路径中删除