代码之家  ›  专栏  ›  技术社区  ›  mooware

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

  •  17
  • mooware  · 技术社区  · 15 年前

    对于Java项目,我想将所有第三方JAR合并到Apache Ant创建的主jar中,这是我已经设法做到的。

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

    我试图用一个 excludes -属性或 exclude -标签,但似乎没有任何效果。

    这是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中筛选文件?谢谢你的帮助!

    6 回复  |  直到 15 年前
        1
  •  11
  •   carej    15 年前

    据我所知,在使用<zipgroupfileset>时无法进行筛选:此处使用的包含/排除适用于要合并的zip,而不是其中的内容。

    如果要合并一组众所周知的JAR,则可以对每个JAR使用单独的<zipset>条目;此方法允许使用include/exclude筛选源存档的内容。

    另一种方法是简单地将所有内容解压缩到一个临时位置,删除/修改不需要的位,然后将所有内容重新压缩。

        2
  •  36
  •   Alberto González Palomo    15 年前

    凯瑞是对的。我一直在尝试这样做,将其他jar合并到我的应用程序jar中,排除了一些文件,而且没有办法使用 <zipgroupfileset> 为了它。

    我的解决方案是unzip/clean-up/jar方法的变体:我首先将所有外部库jar合并为一个 <压缩组文件集> ,然后合并到我的 <zipfileset> 它允许过滤。在我的例子中,它的工作速度明显更快,而且比将文件解压缩到磁盘更干净:

    <jar jarfile="${dist}/lib/external-libs.jar">
      <zipgroupfileset dir="lib/">
        <include name="**/*.jar"/>
      </zipgroupfileset>
    </jar>
    <sleep seconds="1"/>
    <jar jarfile="${dist}/lib/historadar-${DSTAMP}.jar" manifest="Manifest.txt">
      <fileset dir="${build}" includes="**/*.*"/>
      <zipfileset src="${dist}/lib/external-libs.jar">
        <exclude name="*"/>
      </zipfileset>
    </jar>
    

    第一 <jar> 将它在lib/中找到的所有jar放到external-libs.jar中,然后让它等待一秒钟,以避免收到关于将来有修改日期的文件的警告,然后我将来自build/目录的类文件与external-libs.jar的内容合并,不包括根目录中的文件,在本例中是自述文件和示例文件。锿。

    然后,我有自己的自述文件,其中列出了有关我在应用程序中包含的库(如许可证、网站等)所需的所有信息。

        3
  •  3
  •   ariel17    12 年前

    你可以使用 exclude 参数在 zipfileset 标记从合并的外部JAR文件中删除内容,如下所示:

    <jar jarfile="${dist}/lib/external-libs.jar">
      <zipgroupfileset dir="lib/" excludes="META-INF/**/*">
        <include name="**/*.jar"/>
      </zipgroupfileset>
    </jar>
    

    生成的JAR文件将是无符号的。

        4
  •  2
  •   b10y    12 年前

    阿尔贝托的回答很好,但需要时间解压和重新压缩存档。我实现了一个新的Ant任务,使用内置的过滤功能,从而加快了执行速度:

    public class FilterZipTask extends Task {
    
      private Zip zipTask;
    
      private List<FileSet> groupfilesets = new ArrayList<FileSet>();
    
      private String excludes;
    
      public void setExcludesInZips(String excludes) {
        this.excludes = excludes;
      }
    
      public void addZipGroupFileset(FileSet set) {
        groupfilesets.add(set);
      }
    
      public void addZip(Zip zipTask) {
        this.zipTask = zipTask;
      }
    
      @Override
      public void execute() throws BuildException {
        for (FileSet fileset : groupfilesets) {
          Iterator<FileResource> iterator = fileset.iterator();
          while (iterator.hasNext()) {
            ZipFileSet zfs = new ZipFileSet();
            FileResource resource = iterator.next();
            zfs.setSrc(resource.getFile());
            zfs.setExcludes(excludes);
            zipTask.addZipfileset(zfs);
          }
        }
        zipTask.execute();
      }
    }
    

    并在构建文件中使用它,如下所示:

    <taskdef name="filterzip" classname="FilterZipTask"/>
    <filterzip excludesInZips="META-INF/*.*">
      <zipgroupfileset dir="${deps.dir}" includes="*.jar" />
      <zip destfile="${destjar}" />
    </filterzip>
    
        5
  •  0
  •   NEELENDRA KUMAR    10 年前

    我也面临同样的问题。谷歌搜索了很多,找到了一些对我有用的东西。 取消JAR文件删除。 Meta—IF/ .sf(平方英尺) Meta—IF/ 数字减影血管造影 文件夹。再次jar并运行它,不应该显示错误消息。

    错误原因解释如下: http://qe-cafe.blogspot.in/2010/06/invalid-signature-file-digest-for.html

        6
  •  0
  •   Ves    8 年前

    在同一个问题上苦苦挣扎了几个小时,最后写了一个新的任务,扩展了现有的任务:

    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>