2

私はこの記事を読み、それを使用して次のような最初のAntタスクを作成しましたAutoTestTask

public class AutoTestTask extends org.apache.tools.ant.Task {
    // ...
}

また、このオブジェクトをコンパイルしてパッケージ化しましauto-test.jarた。

Antの理解が正しければ、それを別のプロジェクトのビルドの一部として含めるために、次のXMLを使用します。

<project name="SomeProject" basedir="." default="deploy" xmlns:at="antlib:org.me.auto-test">
    <!-- Task definitions. -->
    <taskdef name="at-autotest" classname="org.me.auto-test.AutoTestTask"/>

    <!-- Use the task. -->
    <at:autotest/>
</project>

$ {ANT_HOME} / libディレクトリにもコピーする必要があると思います-か確認してもらえますか?私を混乱させているのは、XMLの上部にある属性、具体的にはその部分です。これは、「*名前空間で修飾されたものはすべて、ルートパッケージが*の$ {ANT_HOME} / lib内にある」というAnt固有のプロトコルですか?もしそうでなければ、誰かがそれが何を意味するのか説明できますか?auto-test.jarxmlns:at="antlib:org.me.auto-test"antlib:<whatever>atorg.me.auto-test

また、明らかなものが欠けている場合や、設定が間違っている場合は、お知らせください。前もって感謝します!

4

4 に答える 4

1
  1. ハイフンを使用してパッケージをコンパイルできないため、次のように変更auto-testすることをお勧めします。autotest
  2. taskdefあなたが持っている、at-autotestする必要がありますautotest
  3. xmlns宣言は、xmlパーサーおよびantlibsを使用するためのものです。最初のアリのタスクにそれらを使用する必要はありません。したがって、削除xmlnsしてat:プレフィックスを付けます。

「何が足りないのか」と質問されたので、表示されたエラーメッセージを報告してください。おそらく上記の提案に従った後。

于 2012-09-30T18:33:49.403 に答える
0

OK、思ったより簡単ですが、少し注意する必要があります。

最初の問題は<taskdef name="at-autotest" .. />、タスクを「at:autotest」として使用しようとするためです。「at」はxml名前空間プレフィックスであるため、タスクデスク定義の先頭に「at-」を削除する必要があります。

2番目の問題は、taskdefをxml名前空間 "antlib:org.me.auto-test"に関連付けていないため、プレフィックスを使用できないことです。この段階では、のように現在の名前空間(つまりプレフィックスなし)で使用できます<autotest/>。ただし、すべての外部タスクに個別の名前空間を指定することをお勧めします。そのため、正しいバージョンは次のとおりです。

<project name="SomeProject" basedir="." default="deploy" xmlns:at="antlib:org.me.auto-test">
    <!-- Task definitions. -->
    <taskdef name="autotest" classname="org.me.auto-test.AutoTestTask" uri="antlib:org.me.auto-test"/>

    <!-- Use the task. You can use the prefix "at:" here -->
    <at:autotest/>
</project>

さらにいくつか:

  1. この設定では、タスククラスのjarを$ {ANT_HOME}/libに配置する必要があります。ただし、これを行う必要はありません。場所がわかっている場合は、jarを直接参照できます(たとえば、プロジェクトのルートフォルダー内のlibフォルダー)。次のように、jarを含むクラスパスを指定できます<taskdef>(そのクラスパスを定義し、id = "autotest.classpath"を割り当てたと仮定します)。

    <!-- Task definitions. -->
    <taskdef name="autotest" classname="org.me.auto-test.AutoTestTask" 
           uri="antlib:org.me.auto-test" classpathref="autotest.classpath" />
    
  2. ここで別の人が提案しているように、クラスをantlibにまとめてパッケージ化することができます。jarとの唯一の違いは、ファイル'antlib.xml "が含まれていることと、このjarがすでにメインクラスパスにある場合はtaskdef宣言をスキップできることです。ここを読んでください。ここに" antlib:"名前空間プレフィックスがあります。個人的には${ANT_HOME}/ libに物を入れるのが好きではないので、クラスパスでを使用でき<taskdef />ますが、jarをantlibとしてパッケージ化し、antlibを使用することをお勧めします。とにかく慣例としての名前空間プレフィックス。

于 2012-10-01T01:17:10.470 に答える
0

タスクをantlibとしてパッケージ化しようとしています。XMLファイルは名前空間と一致し、taskdef操作が含まれます。

antlibは比較的新しいので、古い「ANTタスクの作成方法」チュートリアルでそれらについて言及されていない理由を説明している可能性があります。

于 2012-09-30T14:53:25.943 に答える
0

ほとんどの場合、拡張によって新しいantタスクを作成するのorg.apache.tools.ant.Taskはやり過ぎです。
他の方法もあることに注意してください。antapiieGroovy、Javascript (jdk> = 6にはrhino1.6に基づく独自の組み込みjavascriptエンジンが付属)に完全にアクセスできるスクリプト言語と組み合わせてscriptdef
を 使用して、ant内のタスクを定義します。 後でコンテンツをバンドルするには、すべてのscriptdefmacrodefを含むcommons.xmlを作成し、importを使用して他のAntスクリプトで使用できるようにします。

于 2012-09-30T20:17:18.910 に答える