frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

時計を疑え。

今日も学校で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分、その日付が未来じゃなくなるまで待つ訳で。

この影響で、Xdocletxmlファイルを生成してくれなかったりして、

これがないと先に進めないので、えらい待たされゲンナリ。

仕方ないので、後者の長いエラー文の方をググって見ると、

ひっかかるのは外国のサイト。しかも韓国。

韓国語は読めません…(涙)

そのうち、そのエラーを実際に吐いているソース自体を発見。

てなこったで、早速ソースを追っていくと、どうやら…

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

…って訳で。

皆さんも何かこんなような症状くらった時は

基本ですが、サーバーの時計を疑ってください。。。(脱力)