2009-08-13 18 views
15

Javaプロジェクトの場合、依存するすべてのサードパーティ製のjarファイルを、すでに管理しているApache Antで作成されたメインjarファイルにマージしたいと思います。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> 

どのように私はこのアリ・タスクにおける結果のjarファイルからファイルをフィルタリングすることができますか?ご協力いただきありがとうございます!

+0

(https://bz.apache.org/bugzilla/show_bug.cgi?id=34403)[zipgroupfilesetは、ネストされたパターンの仕様をサポートする必要があります]バグを参照してください。 –

答えて

8

<zipgroupfileset>を使用してフィルタする方法はありません。そこに使用されているインクルード/除外は、マージするジップに適用され、その中の内容ではありません。

マージするよく知られたJARのセットがある場合は、個々に<ジップセット>のエントリを使用できます。この方法では、include/excludeを使用してソースアーカイブの内容をフィルタリングすることができます。

代替方法としては、すべてを一時的な場所に解凍し、不要なビットを削除または変更してから、すべてを元に戻します。

34

carejです。私はこれをやろうとしており、他のjarファイルをいくつかのファイルを除いてアプリケーションjarファイルにマージしています。それには<zipgroupfileset>を使用する方法がありません。

私のソリューションは、解凍/クリーンアップ/ジャー法の変形である:私はまず、<zipgroupfileset>と一つに、すべての外部ライブラリのjarファイルをマージフィルタリングを許可してい<zipfileset>で鉱山にそれをマージします。私の場合、それはより速く目立って動作し、ディスクにファイルを解凍するよりもきれいです:最初<jar>が、それはlibに/外部libs.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> 

、その後、私はそれが1を待たせます後で変更日付を持つファイルに関する警告を受け取らないようにするために、次に、ビルド/ディレクトリからクラスファイルを外部-libs.jarの内容にマージします。この場合、ルートにあるファイルは除きます。例。

その後、私はあなたがからコンテンツを削除するzipfilesetタグにexcludeパラメータを使用することができます

+0

ありがとう、これは本当に役に立ちました! – tth

2

などのライセンス、ウェブサイト、として、私は自分のアプリケーションに含まれ、これらのライブラリについて必要なすべての情報を一覧表示します私自身のREADMEファイルを持っていますこのように、外部のJARファイルをマージ:

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

たJARファイルが署名されます。

2

アルベルトの回答はうまくいきますが、解凍するには時間がかかります&アーカイブをリジップします。

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

私も同じ問題に直面していた私は、結果が非​​常に速く、実行にすることを、内蔵のフィルタリング機能を使用する新しいAntタスクを実装しました。私はグーグルでグーグルで働いているものを見つけました。 ファイルをjarファイルから削除します。 META-INF/.SF、 META-INF/ .DSA ファイル。再びJarを実行して、エラーメッセージを表示しないでください。エラーの

原因は、ここで説明されていますhttp://qe-cafe.blogspot.in/2010/06/invalid-signature-file-digest-for.html

0

は数時間のために同じ問題で苦労するので、既存のものを拡張することにより、新しいタスクを書いてしまったことがあり:付き

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> 
関連する問題