ClickOnceとファイルのロック
Java環境で構成、動作しているアプリケーションサーバにデプロイしたClickOnceアプリケーションの再発行に失敗するという現象に悩まされている。
具体的には一度発行したアプリケーションを、もう一度同じバージョン番号のまま発行しようとするとpublish.htmやsetup.exeのようなファイルを置き換えるのに失敗するという現象だ。
エラー 1 ファイル '〜.publish\publish.htm' を '〜publish.htm' にコピーできませんでした。'publish.htm' を Web に追加できません。 ファイル 'publish.htm' はこの Web に既に存在します。
既にあるのは当たり前でそれを上書きするのを期待するのだが、上手くいかない。
JSDKのバージョンを1.6.0_xから1.4.2_xに戻したり、アプリケーションサーバを変えたりすると直るかと思ったのだが、そうでもないようだ。ところがアプリケーションサーバをTomcat6に変えると全く問題が発生しなかったりする。
恐らくはそのアプリケーションサーバの問題だと思うのだが、それにしても以前は全く発生していなかった不具合である。ClickOnceがらみでVisual Studio 2005の振舞いが変わったのか、それともアプリケーションサーバに充てたアップデートに原因があったのか。さっぱりわからん。
追記:
(問題が発生しているのはWindows Server上なので)FileMonによりpublich.htmがどう扱われているのかのログを採取してみた。
52 10:23:41 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 53 10:23:41 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 55 10:23:41 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 56 10:23:41 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 57 10:23:41 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 60 10:23:42 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 61 10:23:42 javaw.exe:3252 OPEN 〜publish.htm SUCCESS Options: Open Access: Read 62 10:23:42 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 63 10:23:42 javaw.exe:3252 OPEN 〜publish.htm SUCCESS Options: Open Access: 00100080 64 10:23:42 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 65 10:23:42 javaw.exe:3252 CLOSE 〜publish.htm SUCCESS 66 10:23:42 javaw.exe:3252 READ 〜publish.htm SUCCESS Offset: 0 Length: 8096 67 10:23:42 javaw.exe:3252 READ 〜publish.htm SUCCESS Offset: 8096 Length: 8096 71 10:23:43 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 72 10:23:43 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 74 10:23:43 javaw.exe:3252 OPEN 〜publish.htm SUCCESS Options: Open Access: 00100080 75 10:23:43 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 76 10:23:43 javaw.exe:3252 CLOSE 〜publish.htm SUCCESS 77 10:23:43 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 78 10:23:43 javaw.exe:3252 OPEN 〜publish.htm SUCCESS Options: Open Access: Read 79 10:23:43 javaw.exe:3252 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A 80 10:23:43 javaw.exe:3252 READ 〜publish.htm SUCCESS Offset: 0 Length: 8096 81 10:23:43 javaw.exe:3252 READ 〜publish.htm SUCCESS Offset: 8096 Length: 8096
このログはVisual Studio 2005がpublish.htmを発行した後に出力されたものだが、java.exeが同ファイルをOPEN, READした後CLOSEしていないことが解る。同様にTomcat6上で全く同じ条件でログを採取してみたのが、次だ。
52 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
53 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
54 10:27:49 javaw.exe:1232 DIRECTORY 〜 SUCCESS FileBothDirectoryInformation: publish.htm
55 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
56 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
57 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
58 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
59 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
60 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
61 10:27:49 javaw.exe:1232 OPEN 〜publish.htm SUCCESS Options: Open Access: Read
62 10:27:49 javaw.exe:1232 READ 〜publish.htm SUCCESS Offset: 0 Length: 8805
63 10:27:49 javaw.exe:1232 CLOSE 〜publish.htm SUCCESS
64 10:27:49 javaw.exe:1232 OPEN 〜publish.htm SUCCESS Options: Open Access: 00100080
65 10:27:49 javaw.exe:1232 QUERY INFORMATION 〜publish.htm SUCCESS Attributes: A
66 10:27:49 javaw.exe:1232 CLOSE 〜publish.htm SUCCESS
こちらはちゃんとCLOSEしているな。