Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ant:从合并的jar文件中排除文件_Ant_Jar - Fatal编程技术网

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

Ant:从合并的jar文件中排除文件,ant,jar,Ant,Jar,对于一个java项目,我想将它所依赖的所有第三方jar合并到ApacheAnt创建的主jar中,我已经设法做到了这一点 问题是,其中一些jar文件在其META-INF目录中有签名文件,因此当我尝试运行jar文件时,会收到错误消息“清单主属性的签名文件摘要无效”。手动删除签名文件后,错误就消失了 我试图用excludes-属性或exclude-标记过滤掉ant文件中的签名文件,但似乎没有任何效果 这是ant的任务: <target name="jar" description="Create

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

问题是,其中一些jar文件在其
META-INF
目录中有签名文件,因此当我尝试运行jar文件时,会收到错误消息
“清单主属性的签名文件摘要无效”
。手动删除签名文件后,错误就消失了

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

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

据我所知,使用时无法进行过滤:此处使用的include/excludes适用于要合并的拉链,而不是其中的内容

如果您有一组众所周知的JAR要合并,您可以为每个JAR使用单独的条目;这种方法允许使用include/exclude来过滤源归档的内容


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

carej是正确的。我一直在尝试这样做,将其他jar合并到我的应用程序jar中,不包括一些文件,但没有办法使用

我的解决方案是unzip/clean-up/jar方法的一个变体:我首先使用
将所有外部库jar合并为一个,然后使用允许过滤的
将其合并到我的中。在我的例子中,它的工作速度明显快于将文件解压缩到磁盘:

<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>

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


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

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

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


生成的JAR文件将是未签名的。

Alberto的答案很好,但解压和重新压缩存档需要时间。我实现了一个新的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();
  }
}
public类FilterZipTask扩展任务{
私人拉链;
private List groupfileset=new ArrayList();
私有字符串排除;
public void setExcludesInZips(字符串排除){
this.excludes=excludes;
}
public void addZipGroupFileset(文件集集){
groupfilesets.add(set);
}
公共无效地址(Zip zipTask){
this.zipTask=zipTask;
}
@凌驾
public void execute()引发BuildException{
for(文件集文件集:组文件集){
迭代器迭代器=fileset.Iterator();
while(iterator.hasNext()){
ZipFileSet zfs=新的ZipFileSet();
FileResource=iterator.next();
setSrc(resource.getFile());
zfs.setExcludes(不包括);
zipTask.addZipfileset(zfs);
}
}
execute();
}
}
并在生成文件中使用它,如下所示:

<taskdef name="filterzip" classname="FilterZipTask"/>
<filterzip excludesInZips="META-INF/*.*">
  <zipgroupfileset dir="${deps.dir}" includes="*.jar" />
  <zip destfile="${destjar}" />
</filterzip>

我也面临同样的问题。谷歌搜索了很多,发现了一些对我有用的东西。 取消jar,删除jar文件。 META-INF/.SF, META-INF/.DSA 文件夹。再次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());
        }
    }

}
import java.util.HashSet;
导入java.util.Set;
导入java.util.StringTokenizer;
导入org.apache.tools.ant.taskdefs.Jar;
导入org.apache.tools.ant.types.ResourceCollection;
导入org.apache.tools.ant.types.ZipFileSet;
公共类CustomizedJarTask扩展了Jar{
保护集过滤器;
@凌驾
公共void添加(资源集合资源){
if(filters!=null&&resources-instanceof-ZipFileSet){
ZipFileSet=ZipFileSet.class.cast(参考资料);
用于(字符串筛选器:筛选器)
set.createExclude().setName(过滤器);
}
super.add(资源);
}
公共void setFilters(字符串模式){
StringTokenizer标记器=新的StringTokenizer(模式,,,false);
while(tokenizer.hasMoreTokens()){
if(过滤器==null)
filters=newhashset();
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>

请参见错误。