- ベストアンサー
warファイルを展開するとタイムスタンプが保持されない
複数個のclassから成るWebアプリケーションをwarで固めて客先に配布しています。 ここで、クラスに不具合が見つかって修正が入ると、 1.Antでプロジェクトを一括してコンパイル 2.更新されたソースだけがコンパイルされる 3.プロジェクト全体がwarにビルドされる という手順を踏んでいます。 が。受け取った側がwarを展開すると、ファイルのタイムスタンプが全て展開された日時になってしまいます。 これでは、相手側でどのファイルがいつ修正されたのかわからん!という事態になっており、悩んでいます。 tarだとタイムスタンプは保持されるのですが、何か良い方法はないでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 jarファイルはファイル形式そのものは通常のZIPファイルと同じなので、unzipコマンドやWindows用のほかのツールを使っても大丈夫です。 ものによっては拡張子を.zipに変えないと認識しないアプリケーションもあるかもしれないですが。 >classのタイムスタンプを見れば、今回何が修正されたのかわかる Aクラスが修正されたとして、それを参照しているBやCは修正が無くてもコンパイルされます。また、BやCを参照しているDはAを直接参照していなくてもコンパイルされます。 いろいろな場所から参照されている箇所を変更した場合には、リコンパイルされるクラスの数はフルビルドと大差なくなることもあります。 ソースの変更をバイナリ(.class)ファイルのタイムスタンプなどで管理するのはJavaの性質上無理があります。 さらに蛇足ですが…一部だけのコンパイルは危険です。定数の変更がきちんと反映されないことや、開発端末との時間設定のずれによって、ソースの変更がコンパイラやツールに正常に認識されない危険があります。 コンパイル時はなるべくフルビルドを行い、変更管理はソースをきちんと管理することで行ったほうがいいです。
その他の回答 (2)
- koki_m
- ベストアンサー率83% (45/54)
こんばんは。 jarコマンドは解凍時に現在のタイムスタンプへ変更してしまいます。 私も仕事上で苦戦しました。 別の解凍ツールで試してみてください。
お礼
ありがとうございます。単に解凍コマンドの性質だったのですね。unzipなども使えるようですので、他のツールを試してみます。
- deadlock
- ベストアンサー率67% (59/87)
展開されたファイルのタイムスタンプは展開に使用したツールに依存します。 まずは圧縮までに問題がなかったかを確認し、確認した内容も質問の補足として書いてください。 相手方が使用しているツールとその設定等を確認して、必要であれば設定の変更や使用するツールの指定などを行いましょう。 あと、蛇足かもしれませんが >2.更新されたソースだけがコンパイルされる については、「更新したソースファイル=リコンパイルされたclassファイル」ではありません。 相手側にソースファイルを一緒に送っているのでなければ、確認はできないと思うのですが。
補足
ありがとうございます。こちらからはAntで作成されたwarを送って、相手側ではjar xvf xxx.war ...のコマンドで展開しているのが現状です。Windowsに持ってきて調べたところ、アーカイブ自体にはタイムスタンプ等は保持されているようですね。 あと、後半部分ですが、一部ソースを修正してAntを走らせる→変更があったものだけリコンパイルされる→warが作成される→それに含まれるclassのタイムスタンプを見れば、今回何が修正されたのかわかる、という理論なのですが、いかがでしょうか・・・。
お礼
ありがとうございます。解凍の件はunzipを使うことで解決しました。 また、部分コンパイルですが、変更したものだけ更新されると思っていたので大変助かりました。変更管理はキチンとしないといけませんので、開発メンバが触るソースと出荷するソースを完全に分離して管理し、毎回フルでビルドしたいと思います。