- PR -

ant について

投稿者投稿内容
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-01-25 16:09
いろいろ調べてもらっておきながら、こんなことを言うのは申し訳ないのですが。やっぱり私のミスでした。(さんざんいっておきながら…)

元の java.ext.dirs で指定されるディレクトリなのですが、javaがよく分かっていない時にいろいろ入れてしまっていて訳分からなくなったのでサブディレクトリを作ってそこに退避しておいたのですが、ant だとサブディレクトリにあるライブラリまで読込んでしまうようです。
(java.ext.dirs を変えたら動いたのはそのためでした。)
サブディレクトリごと全く違うフォルダに移動したら動いてしまいました…。

単に java コマンドで動かしている時は、サブディレクトリのライブラリは読みこまないので大丈夫だったということです。

大変失礼しました。


[ メッセージ編集済み 編集者: ふうた 編集日時 2002-01-25 16:10 ]
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-01-25 16:27
追記です。

先の修正により、fork="yes" の指定をなくしても、最初の
D:\hoge\build.xml:33: java.lang.IllegalAccessException
のエラーは出なくなりました。(結局なんだったんだ?!)

もともと、ant を入れようと思ったのが、コンパイルや実行時に使用するライブラリを明確にしたいというのが頭にあったので、今回のことでライブラリがだいぶすっきりしてきて、怪我の功名でした。(振り回された方には申し訳ないのですが…)

お騒がせしました。

miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-01-25 16:29
ふうたさん、

私もクラスパスではさんざん苦労をしているので、こうやってAntを調べていくのは自分のためでもあります(し、楽しんでいます)。

ところで、最近、私がAntで悩んでいたことはcopyタスクにfiltering="yes"を指定したとき、コピーした結果のエンコーディングがデフォルトエンコーディングになってしまうということです(エンコーディングを明示的に指定していないので当然の結果です)。

Antのフィルタは、@today@のように@で挟んでおくと、その文字列をコピー時に差し替えることができるものです。たとえば、最終更新日をこのようにして指定しておいて、tstampを使って日付を取り出してフィルタに指定すれば、文書に自動的に更新日を埋め込むことができます。

コード:

<tstamp/>
<filter token="today" value="${TODAY}"/>
<copy todir="output" filtering="yes">
<fileset dir="src"/>
</copy>



私の場合は、文書はUTF-8で書かれてたXMLファイルで、それをAntでビルドするとHTMLになるというものでした。ところが、Antを実行するとHTMLファイルは文字化けを起こしてしまいます。Antのビルドスクリプトは私の書いたものではなく(しかも複雑)、私自身がAntのフィルタをまったく理解していなかったので、ビルドスクリプトのどの部分で文字化けがおこっているのか皆目わかりませんでした。

原因は、最初に書いたように、Antがcopyをするときに、ファイルのエンコーディングをUTF-8からEUC-JPに変換してしまっていたのでした。対処方法としてはLANG=Cでビルドするか、XMLファイルのエンコーディングをUTFからEUC-JPに変換することでした。

このように、Antは属性ひとつの指定の有無で、結果が全く異なることがあります。
でも、とてもおもしろい。

また、Antネタをお願いします。


[ メッセージ編集済み 編集者: miki 編集日時 2002-01-25 16:37 ]

[ メッセージ編集済み 編集者: miki 編集日時 2002-01-25 16:40 ]
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-01-25 17:16
引用:

mikiさんの書き込み (2002-01-25 16:29) より:

また、Antネタをお願いします。



調子にのってもう一つ。
いろいろ使っていくうちに、あーしたい/こーしたいが出てきます。。。

マニュアルを見ると、
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
で、タスクの制御ができるとありますが、例えばどんな使い方があるでしょうか?

とりあえず、私は
コード:
  <target name="init_run" unless="argv1">
    <property name="argv1" value="M0101010001.pmi"/>
  </target>
  <target name="run" depends="compile,init_run">
    <java classname="chkxml"
      classpathref="run.project.class.path">
      <arg value="${argv1}"/>
    </java>
  </target>


のように、デフォルト値の設定で使うしか思いついていません。

本当はもっと細かく、例えばantの起動引数でオプション(-D)をつければ、タスクのオプションを変化させるといったことがしたいのですが。。。
今のままだと、タスクのオプションの組み合わせ毎にターゲットが増えていきそうです。

制御的によい例があれば教えてください。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-01-25 18:17
Ant FAQに参考になりそうな例があります。

http://jakarta.apache.org/ant/faq.html#multi-conditions

Ant 1.4ではconditionというタスクが増えていますね。
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-01-29 10:36
遅い反応ですみません。

参考になる例をありがとうございます。

教えていただいた例では、
ant -Dprop1=aaa -Dprop2=bbb
のように、prop1 と prop2 の値が設定されている時のみ yes
と表示されるようですが、例のbuild.xml にある $${prop1} の
$${} ってどういう意味なのでしょうか?
(ant1.4 からのものなのでしょうか?)


また、タスクのオプションを変える方法ですが、以下のようにしても出来そうです。

<target name="init_verbose" unless="verbose">
<property name="verbose" value="no"/>
</target>

<target name="init_param" depends="init_verbose"/>

<target name="compile" depends="prepare, init_param">
<javac destdir="${build}" verbose="${verbose}">

(以下省略)

ant -Dverbose=yes とすると、コンパイルで verbose オプションを
指定したことになります。
(<target name="init_param" depends="init_verbose"/> は、パラメータが
増えた時のことを考慮しています。)


あと、javaタスク実行時に また例の java.lang.IllegalAccessException が
出ることがありました。
(この場合は、XML SDKは使用していませんが、別のライブラリを使用しています。)
とりあえず fork="yes" で逃げれていますが、どういう時にこのエラーが出るのか
よく分かっていないので困っています。

miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-01-29 11:23
引用:

ふうたさんの書き込み (2002-01-29 10:36) より:

教えていただいた例では、
ant -Dprop1=aaa -Dprop2=bbb
のように、prop1 と prop2 の値が設定されている時のみ yes
と表示されるようですが、例のbuild.xml にある $${prop1} の
$${} ってどういう意味なのでしょうか?
(ant1.4 からのものなのでしょうか?)



最初はタイプミスかとも思いましたが、Ant FAQを注意深く読むと...

This version takes advantage of two things:

●If a property a has not been set, ${a} will evaluate to ${a}.
●To get a literal $ in Ant, you have to escape it with another $ - this will also break the special treatment of the sequence ${.

This is neither readable, nor easy to understand, therefore post-1.4.1
Ant introduces the <isset> element to the <condition> task.

最初の黒丸を読むと、プロパティがセットされていなければ、${a}は${a}のまま評価されるとあります。例えば${prop1}は、セットされていなければ"${prop1}"という文字列として扱われるということです(これはAntを使っているとよく経験することですね)

2番目の黒丸を読むと、$を文字として扱いたい場合は$をもうひとつつけてエスケープしろ、と書いてあります。$${prop1}というのは"${prop1}"という文字列を表すということでしょうか。

つまり、これらは"${prop1}"という文字列の比較(equals)によってプロパティが設定されているかどうかを判断しているということです。とてもわかりにくいですね。そこで、その後の段落で、1.4.1以降で、<isset>要素を追加した、という流れになります。


IllegalAccessExceptionの方は、まったくわかりません。
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-01-29 21:18
分かりやすいご説明ありがとうございます。納得しました。

私の使っているバージョンが、1.4 だったので、1.4.1 にバージョンアップして試しています。

ところが、condition タスクに isset を含むbuild.xml を使ってみると、以下のエラーが出てしまいます。

D:\hoge\build.xml:23: Class org.apache.tools.ant.taskdefs.condition.
And doesn't support the nested "isset" element.

build.xml は、以下のような感じで、例と同じなのですが…

コード:

20:<target name="check-cond">
21: <condition property="cond-is-true">
22: <and>
23: <isset property="prop1"/>
24: <isset property="prop2"/>
25: <not>
26: <isset property="prop3"/>
27: </not>
28: </and>
29: </condition>
30:</target>



ant -version でバージョンを確認しても
Ant version 1.4.1 compiled on October 11 2001
と表示されていますし。。。


なんかいろいろ起こりますねぇ。。。
(使う人が悪いだけ? )

[ メッセージ編集済み 編集者: ふうた 編集日時 2002-01-29 21:28 ]

スキルアップ/キャリアアップ(JOB@IT)