2011-03-01 11 views
2

Antlibで定義されたApache Antマクロ内のリソースにアクセスすることは可能ですか?AntlibリソースへのアクセスApache Antマクロから

たとえば、私のantlib.xmlの中に、私はいくつかのXSLTを実行するマクロを持っています。理想的には、XSLTファイルをantlib.xmlと同じJARにパッケージしたいと思いますが、XSLTの場所を指定する方法はわかりません。問題は、どのような私はstyle属性がにantlibを使用してプロジェクトのためのbasedirに相対的であると私はにどのような方法を見つけることができないで置くということです

<antlib xmlns:tibant="antlib:org.windyroad.tibant"> 
    <macrodef name="configure-ear"> 
     <attribute name="xml" /> 
     <attribute name="out" /> 
     <sequential> 
      <xslt in="@{xml}" 
        out="@{out}" 
        style="...what to put here..."> 
      </xslt> 
     </sequential> 
    </macrodef> 
</antlib> 

:ここ

は(簡体字)のコードですantlib.xmlに相対的なパスを指定します。

アイデア?

私はXSLTを別のファイルとして出荷することができますが、ユーザーにXSLTの場所を指定する方法を教えてください。これは理想的ではありません(tibant.homeプロパティの設定など)。また、echoxmlを使用してXSLTを一時ファイルに書き出すこともできますが、IMOはハックです。

答えて

2

代わりのstyle属性を使用して、あなたはスタイルシートとしてjavaresourceを指定することができますネストされた<style>要素を、してみてください。スタイルシートをjarファイル内のantlib.xmlの隣に置くと、クラスパス上でスタイルシートを利用できます。

<xslt in="@{xml}" 
    out="@{out}"> 
    <style> 
     <javaresource name="your/package/structure/style.xslt" /> 
    </style> 
</xslt> 
+0

ありがとうございました。私はそれを働かせようとしていますが、明示的にクラスパスを指定しない限り、xsltを見つけることができません。私はどうやって行くのか教えてくれます。 –

+0

@Tom Ohクラスローディングの楽しさ! 'javaresource'はantlibのクラスローダーではなく、antlibの中でコアのantクラスローダーをデフォルトで使用しているようですが、これは私が正しいと思っていたものです。バグとして報告する価値があるかもしれません。 – matt

+1

@Tom潜在的な回避策のいくつか:ant libディレクトリの1つにjarファイルを置くか、antに '-lib'オプションを指定してantに依存するantlib uri名前空間宣言からantlibを自動的に探します(これは私がやったことですそれが私のために働くように思われた理由です)。その後、everthingはコアクラスローダーを使用します。あるいは、 'taskdef'と' javaresource'に 'loaderRef'属性を使います。両方とも同じ文字列を使用するようにしなければなりませんが、antlibの 'javaresource'にクラスパスを指定する必要はありません。 – matt

1

まず、クラスローダーからリソースとしてXSLをロードすることです。 LoadResourceタスク(http://ant.apache.org/manual/Tasks/loadresource.html)でこれを達成できるはずです。次は、XSLTタスクが指定スタイルに対して与えるオプションを見ていきます。それは、XSLTの文字通りの内容を取る能力を持っているようには見えません。この問題を回避するには、XSLTコンテンツを一時ファイルに書き込んでから、一時ファイルへのパスをXSLTタスクに渡します。クラスローダから

そう...

  1. ロードXSLTテキスト。
  2. Tempfileタスク(http://ant.apache.org/manual/Tasks/tempfile.html)を使用してテンポラリファイルを取得します。
  3. エコータスクを使用して、一時ファイルにXSLTテキストを書き出します。
  4. 一時ファイルを参照してXSLTを呼び出します。