時計を疑え。
今日も学校でHibernate。
でも我が家の環境じゃ全く遭遇しない警告文(?)が
一人で小首をかしげまくる事、数時間。
その警告文っぽい物たるや…
[javac] Warning: XXX.java modified in the future.
…とか、
[xdoclet] XJavaDoc Ignoring class XXX in XXX.java. It was generated (Tue Aug 09 11:08:32 JST 2005) after XJavaDoc's timestamp was reset (Tue Aug 09 10:55:21 JST 2005)
…とかって、なんか時間関係っぽかったのですが。
その間、せっせと症状をメモって解決したので
以下、そのメモを貼っておきます。
これらの警告文の言いたい事は、
「ファイルの更新日時が、未来の日付になっとるぞ」てなもんで、
そーゆーファイルは「あり得ない変なもの」とみなされちゃうのか
本来すべき作業を、ほどこしてもらえない模様。
かくして、その更新日付が13分先の未来であったら
13分、その日付が未来じゃなくなるまで待つ訳で。
この影響で、Xdoclet が xmlファイルを生成してくれなかったりして、
これがないと先に進めないので、えらい待たされゲンナリ。
仕方ないので、後者の長いエラー文の方をググって見ると、
ひっかかるのは外国のサイト。しかも韓国。
韓国語は読めません…(涙)
そのうち、そのエラーを実際に吐いているソース自体を発見。
てなこったで、早速ソースを追っていくと、どうやら…
if( sourceFile.lastModified() > _birthday )
…って条件に該当すると、
このメッセージが出てきてxmlファイルが出力しないらしい。
警告文中の最初の日付は sourceFile.lastModified() にあたり、
AbstractFile sourceFile = getSourceFile( qualifiedName );
をやって、ファイル情報を取得したんだかしてから、
これに対してlastModified()をして、更新日時を取得。
最後の日付は _birthday にあたり、
XJavaDocのコンストラクター内で
_birthday = System.currentTimeMillis();
をやっている。つまり現在の時刻らしい。
って訳で。
ファイルの最終更新時刻 と XJavaDocの呼ばれた時刻が比較され
ファイルの更新時刻のが未来である場合
(XJavaDocを起動した後にファイルが更新された場合)は
作業をキャンセルしている。
[xdoclet] XJavaDoc Ignoring class XXX in XXX.java. It was generated (Tue Aug 09 11:08:32 JST 2005) after XJavaDoc's timestamp was reset (Tue Aug 09 10:55:21 JST 2005)
時間がおかしい場合に、まず疑うのはタイムゾーンだろうから
それを調べるために、改めてさっきの警告文を見てみると
ファイルの更新時刻は、11時08分32秒
XJavaDocの呼ばれた時刻は、10時55分21秒 で両方ともJST。
続いて、実験。
Windowsの時計のさす時刻が、11時03分46秒に
実行させたものの警告文を見てみる
[xdoclet] XJavaDoc Ignoring class XXX in XXX.java. It was generated (Tue Aug 09 11:08:32 JST 2005) after XJavaDoc's timestamp was reset (Tue Aug 09 11:04:28 JST 2005)
そして、この「ファイルの最終更新時刻」だと言い張るファイルを
デスクトップ上から確認してみると、
確かに 2005年8月9日、11:08:32 が最終更新時刻になっている。
・・・ん?
つまり、そもそもWindows自体の時間がおかしいとか?
…って違うらしい。Eclipse内で更新したファイルの更新日時だけがおかしいみたい?
なぜだ。なぜなんだ。。。
って訳で、とりあえず、ファイルの最終更新時刻だと言い張る時間まで
何も出来ないんじゃ困るので、なんかごまかす方法を考える
このフリーウェアでどうよ。
どうかな、ちゃんとファイルのタイムスタンプは変更されたんだけど
Eclipse自体がだまされてくれるかなぁ?
やったー!うまくいったー!
しかし毎度毎度やるの面倒だな…と思ったら
Antの機能にあるじゃないですか、そーゆーの。
<!-- Eclipseのファイルに書き込む更新時刻が狂ってXJavaDocが動かないので強制変更 -->
<target name="timestamp">
<touch datetime="01/01/2000 0:00 am">
<fileset dir="${src}">
<include name="**/*.java" />
</fileset>
</touch>
</target>
…を build.xml に追加しつつ、
例の問題が出ている xdoclet の処理のところを
<target name="xdoclet" depends="timestamp">
と書き換えておく。
これでxdocletを処理する前に、必ず更新時刻が変更され
問題なくxmlファイルも自動生成されるようになりました!
しかし、常に2000年にされるのは、気持ち悪いな。
本当は、Eclipseが言い張る更新時刻-13分程度を設定してあげたいもんなのだが。
…と、もがいているうちに、
クラスメートさんがやってきて、一発解決。<Vielen Dank
実はEclipseで使ってるプロジェクトファイル達は
ネットワークドライブ上にありまして、
そのドライブのあるサーバーの時計が13分進んでおりました…(涙)
つまりは、Eclipseが変な時刻のファイルを生成してるんじゃなくて、
そのネットワークドライブ上で生成した物は
全て13分程未来なファイルになってた次第。
…って訳で。
皆さんも何かこんなような症状くらった時は
基本ですが、サーバーの時計を疑ってください。。。(脱力)