2009-04-15 7 views
2

私はbuild.xml<path id="...">を持っています。コンパイラを起動する前に、クラスパス上のすべてのjar /ディレクトリが存在することを確認し、欠落したものを含む警告を出力します。誰かが既存のソリューションを知っているのですか、それとも私自身のタスクを書く必要がありますか?antでのクラスパス検証


OK、私はカスタムタスクに行くことにしました。

import java.io.File; 
import java.util.Iterator; 

import org.apache.tools.ant.BuildException; 
import org.apache.tools.ant.Task; 
import org.apache.tools.ant.types.Reference; 
import org.apache.tools.ant.types.ResourceCollection; 
import org.apache.tools.ant.types.resources.Resources; 

public class CheckClasspathTask extends Task { 

    private Reference reference; 

    public CheckClasspathTask() { 
    } 

    public void setRefId(Reference reference) { 
     this.reference = reference; 
    } 

    public void execute() throws BuildException { 
     Resources resources = new Resources(); 
     resources.setProject(getProject()); 
     resources.add((ResourceCollection) reference.getReferencedObject()); 
     boolean isFirst = true; 
     for (Iterator i = resources.iterator(); i.hasNext();) { 
      String f = i.next().toString(); 
      if (!new File(f).exists()) { 
       if (isFirst) { 
        isFirst = false; 
        System.out.println("WARNING: The following entries on your classpath do not exist:"); 
       } 
       System.out.println(f); 
      } 
     } 
    } 
} 

答えて

1

私はおそらくカスタムAntタスクが少しこのbuild.xmlの「pre-dist」ターゲットで行わorg.netbeans.modules.bpel.project.anttasks.ValidateBPELProjectTaskのように、順序であると言うでしょう。ここでは、ケースの誰に今までそんなことを必要とする、です。

注:ValidateBPELProjectTask ant taskは通常のカスタムタスクよりも少し複雑です。実行するには独自のクラスパスが必要です(クラスパスは最初はbuild.xmlに最初に渡されません)。
現在のantタスククラスローダーのクラスパスを変更できないため、ValidateBPELProjectTaskは新しいAntClassLoaderを定義し、setContextClassLoader()を呼び出します。

しかし、このようなメカニズムは必要ありません。ディレクトリのリストを渡すだけで、タスクとしてパラメータとして確認できます。

+0

私は、パスオブジェクトをカスタムタスクに渡すのは簡単だと思います。それはあなたが「ディレクトリのリストを渡す」という意味であると思いますか? – araqnid

+0

@araqnidはい、それは私が意味したことです – VonC

1

デフォルトのタスクを使用してAntスクリプトのパスを反復処理する方法は多数見つかりませんでした。 UNIXのようなシェルを持つマシンをビルドする場合は、シェルに呼び出してクラスパスの要素をチェックすることができます。

シェルスクリプトを呼び出すときには、apply taskを使用できますが、classpath要素が存在しない場合には印刷できません。

あなたは以下のクラスパス宣言を持っていると仮定しましょう:

<path id="your.classpath"> 
    <fileset dir="your.libs"/> 
    <pathelement location="/some/missing/dir"/> 
</path> 

これが欠落している要素がある場合に報告しますが、どれを教えてくれていません:あなたはこれを組み合わせることができ

<apply executable="test" type="file" ignoremissing="false"> 
    <arg value="-e"/> 
    <srcfile/> 
    <path refid="build.classpath"/> 
</apply> 

シンプルなシェルスクリプトを使用して、executable属性を変更することで、あなたが望むものを得ることができます.-大きな警告メッセージとビルド失敗を望むだけの場合:

#!/bin/sh 

test -e "$1" || echo "WARNING: Classpath element $1 does not exist!" 

ビルドを失敗させたい場合は、エラーが報告された場合(この場合、ファイル/ディレクトリが見つからない場合)にapplyタスクを失敗させてからシェルスクリプトを修正してから、警告が表示されます。

代替はexec taskを使用して、ほんの少しのスクリプトをインラインで実行するために、次のようになります。

<pathconvert property="classpath" refid="build.classpath" pathsep=":"/> 
<exec executable="sh"> 
    <arg value="-c"/> 
    <arg value="for f in `echo ${classpath} | tr ':' '\n'`; do test -e $f || echo WARNING: Classpath element $f  does not exist!; done"/> 
</exec> 
+0

残念ながら、私はすべての開発者の箱にUnixのようなシェルを置くことに頼ることができないので、私はJavaに固執する必要があります。 しかし、あなたの1ライナーは〜/ .bashrcの機能になる価値があります。 +1 – ngn

2

これはクラスパス内のすべてのファイルやフォルダが存在することを確認します。そのうちの1つが見つからない場合、見つからない最初の名前を示すビルドに失敗します。

<target name="check-classpath" depends="create-classpath"> 
    <pathconvert pathsep="," property="myclasspath" refid="compile.classpath"/> 
    <foreach list="${myclasspath}" param="file" target="check-file-or-folder-exists" /> 
</target> 

<target name="check-file-or-folder-exists"> 
    <fail message="Error: ${file} not found"> 
     <condition> 
     <not> 
      <available file="${file}" /> 
     </not> 
     </condition> 
    </fail> 
</target> 

<foreach>はアリ投稿記録であることに注意してください - Ant Contribs clickable LINK

これはアリ - contribのjarをロードし、その中のすべてのターゲットをフックアップするために必要とされるであろう。

あり
<taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
    <classpath> 
     <pathelement location="${some.lib.dir}/ant-contrib-1.0b3.jar" /> 
    </classpath> 
</taskdef> 

<for>タスクが存在するはずです。このタスクでは、すべてのパス要素を処理し、最後にエラーのみを表示するオプションを設定できます。 Eclipseのバージョンが<foreach>であることがクラスパス上にあることがわかったので、これで十分でした。

関連する問題