Ant:从合并的 jar 文件中排除文件

标签 ant jar

对于一个 java 项目,我想将它依赖的所有第三方 jar 合并到由 Apache Ant 创建的主 jar 中,我已经设法做到了。

问题是其中一些 jar 文件在其 META-INF 中有签名文件。 -directories,所以当我尝试运行我的 jar 文件时,我收到错误消息 "Invalid signature file digest for Manifest main attributes" .在我手动删除签名文件后,错误消失了。

我尝试使用 excludes 过滤掉我的 ant 文件中的签名文件-属性或exclude -tag,但似乎没有任何效果。

这是 Ant 任务:

<target name="jar" description="Creates the jar file">
  <mkdir dir="${jar}"/>
  <jar destfile="${jar}/${ant.project.name}.jar" level="9" filesetmanifest="mergewithoutmain">
    <zipgroupfileset dir="${lib}" includes="*.jar"/>
    <zipfileset dir="${class}"/>
    <manifest>
      <attribute name="Main-Class" value="${mainclass}"/>
    </manifest>
  </jar>
</target>

如何在这个 ant 任务中从生成的 jar 中过滤文件?谢谢你的帮助!

最佳答案

几个小时以来一直在同一个问题上苦苦挣扎,所以最终通过扩展现有任务来编写一个新任务:

import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

import org.apache.tools.ant.taskdefs.Jar;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.ZipFileSet;

public class CustomizedJarTask extends Jar {

    protected Set<String> filters;

    @Override
    public void add(ResourceCollection resources) {
        if (filters != null && resources instanceof ZipFileSet) {
            ZipFileSet set = ZipFileSet.class.cast(resources);
            for (String filter : filters)
                set.createExclude().setName(filter);
        }
        super.add(resources);
    }

    public void setFilters(String patterns) {
        StringTokenizer tokenizer = new StringTokenizer(patterns, ", ", false);
        while (tokenizer.hasMoreTokens()) {
            if (filters == null)
                filters = new HashSet<>();
            filters.add(tokenizer.nextToken());
        }
    }

}

有了以上内容,我在构建文件中只需要:
<taskdef name="customized-jar" classname="CustomizedJarTask" classpath="${basedir}/bin/" />
<customized-jar jarfile="${directory.build}/external-libs.jar" duplicate="fail" filters="META-INF/**">
    <zipgroupfileset dir="${directory.libs}">
        <include name="**/*.jar" />
    </zipgroupfileset>
</customized-jar>

关于Ant:从合并的 jar 文件中排除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1274879/

相关文章:

java - .jar 文件无法运行? (我觉得我错过了一些明显的东西,在来这里之前自己寻找解决方案。)

java - 将所有 jar 合并或合并到一个可执行 jar 中

java - sipFactory.setPathName ("gov.nist");运行时错误

java - 在 ANT 构建中添加文件(Tomcat 服务器)

android - 使用ant(build.xml)编译jni目录

java - 执行 phonegap 命令 cordova build 时出错

java - 不同 Java 应用程序导出选项的奇怪行为

c++ - 通过 Windows 命令行,我们如何编译 Netbeans C/C++ 应用程序?

java - ANT 中的目标是什么

java - 查看 .jar 文件的内容