2005年8月 9日

時計を疑え。

今日も学校でHibernate。

でも我が家の環境じゃ全く遭遇しない警告文(?)が
Javaコンパイラ や Xdocletまわりで出て、
一人で小首をかしげまくる事、数時間。

その警告文っぽい物たるや…

[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分程未来なファイルになってた次第

…って訳で。

皆さんも何かこんなような症状くらった時は
基本ですが、サーバーの時計を疑ってください。。。(脱力)

Posted by anigon at 11:18 PM

「Jadで逆コンパイル。」へ戻る | 「DIコンテナ導入前準備中。」へ進む

上へ戻る