• 締切済み

JavaWebStart でダウンロード直後かどうかを判定するには

JWS (Java Web Start) で Java アプリケーションを WEB サーバから配布します。このとき、WEB サーバ上の jar ファイルを更新したときユーザに jar ファイルをダウンロードさせる、というのが JWS のデフォルトの動きになりますが、アプリケーション側で、(更新)ダウンロードされてから最初のアプリ起動であるか否かを判定するにはどうしたらよいでしょうか。 具体的なシチュエーションとしては、アプリケーションが、自分自身の jar ファイル内のファイルを、ローカル環境にプレーンファイルとして展開してそれを使用したいのですが、起動のたびに展開すると時間がかかるので、jar ファイルが更新されたとき、つまりサーバからダウンロードした直後の起動のときだけそれを行いたいのです。 展開したファイルの作成日時と jar ファイルの作成日時が比較できればよいのですが、自分自身の jar ファイルを java.io.File オブジェクトとして認識する方法がわかりません。また、JNLP ファイルの property に時刻やバージョンなどを書き込むことでも実装はできるのですが、jar ファイルの更新のたびにそれを更新するのも面倒なのでやりたくない、という状況です。 よろしくお願いします。

みんなの回答

  • aton
  • ベストアンサー率47% (160/334)
回答No.2

>Java Web Start 経由で起動すると、どうしても file: から始まらず、ネットワークが切断されていようとも必ず http: で始まる文字列になってしまいます。何がまずいでしょうか。 Java Web Start 経由での起動はやったことがなかったので(そんなんで「経験者」「自信あり」にするのはどうかしてると思うのですが>自分),そうなってしまいましたか…。 では,展開するファイルをabc.datとして, URL url =(jarファイル内のクラスのインスタンス).getClass().getClassLoader().getResource("abc.dat"); JarEntry entry = ((JarURLConnection) url.openConnection()).getJarEntry(); long time = entry.getTime(); で,abc.datのエントリーの修正日時を取り出し,ローカルに展開したファイルの修正日時と比較するというのはどうでしょうか? これで展開の要否の判断はできないでしょうか? ちなみに修正日時の取り出しは,一応手元で(JWSではなく)JARファイルに適用したコードを書いてみた限りではうまくいったのですが,JWSではどうかわからないので「一般人」「参考意見」にしておきます。 >それから、! の位置は、 ...hogehoge.jar!/abc.dat でした。 そうですね。私の間違いでした。 ちなみに, >java.net.URI には ! のことは載ってないのですねえ については, http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/net/JarURLConnection.html に載っていました。

参考URL:
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/net/JarURLConnection.html
beubeu
質問者

お礼

> URL url =(jarファイル内のクラスのインスタンス).getClass().getClassLoader().getResource("abc.dat"); > JarEntry entry = ((JarURLConnection) url.openConnection()).getJarEntry(); > long time = entry.getTime(); 似たような形で、jar ファイルの中身でなくて jar ファイル自身でやってみました。 まだ細かい戻り値などは見ていないのですが、Java Web Start の機能なのか、ネットワークが切れていても、何故か(?)上手い具合に動くようです。 これで行こうと思います。ありがとうございました。 > >java.net.URI には ! のことは載ってないのですねえ > については, > http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/net/Jar...​ こちらでしたか (^^;

  • aton
  • ベストアンサー率47% (160/334)
回答No.1

java.lang.ClassLoaderのgetResource(String)あるいはfindResource(String)が使えると思います。 jarファイルの中にabc.datというファイルが含まれているとして, String path = (jarファイル内のクラスのインスタンス).getClass().getClassLoader().getResource("abc.dat").getPath(); これでpathには"file:(jarファイルの絶対パス)!abc.dat"という文字列が入っているので,あとはいらない部分を切り取ればjarファイルの絶対パスが得られます。但しjava.lang.ClassLoader#getResource(String)の戻り値はURLであり,従ってpathにISO-8859-1以外の文字が含まれている場合はURLエンコードされています。 #まあ"!abc.dat"を切り取って,"file:(jarファイルの絶対パス)"から #java.net.URIのインスタンスを作り,これからjava.io.Fileのインス #タンスを作れば問題ないと思いますが。

参考URL:
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/ClassLoader.html#getResource(java.lang.String)
beubeu
質問者

お礼

フォローありがとうございます。 なるほど、そういうやり方がありましたか。これなら日時比較ができます。ありがとうございました。 ただ、RFC による URL の定義や、java.net.URI には ! のことは載ってないのですねえ。

beubeu
質問者

補足

Java Web Start 経由で起動すると、どうしても file: から始まらず、ネットワークが切断されていようとも必ず http: で始まる文字列になってしまいます。何がまずいでしょうか。 それから、! の位置は、 ...hogehoge.jar!/abc.dat でした。

関連するQ&A

専門家に質問してみよう