• ベストアンサー
  • 困ってます

スタンドアロンJavaプログラム(Swing)の複数起動の抑止方法

SwingでスタンドアロンのJavaプログラムを作成しています。 Executable JARファイルとして、ダブルクリックにより起動するのですが、一度起動した後もう一度ダブルクリックすると同じプログラムが別に起動してしまいます。 JDK1.5、OSはWindowsが対象です。 複数起動できないようにする方法はありますでしょうか? よろしくお願いします。 ※ファイルに起動フラグを書出すという方法は考えてみましたが、クラッシュ(異常終了)したときに起動不可能になるためこの方法は使用できませんでした。

共感・応援の気持ちを伝えよう!

  • Java
  • 回答数2
  • 閲覧数4398
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2
  • gimmick
  • ベストアンサー率49% (134/270)

私が思いつく一般的と思われる方法は2つあります。 (1)WindowsのMutexを利用する方法 WinAPIのCreateMutex()を利用し、適当な名前のMutexを作成します。 Mutex作成の成功・失敗でプログラムの二重起動を判定します。 Windowsでは一般的な方法ですので情報は手に入れやすいと思います。 ただし、Java以外の言語でプログラムを書く必要があります。 (2)ファイルチャネルのロックを利用する方法 あくまでJavaのみでということでしたら、ファイルチャネルのロックを利用する方法があります。 説明しにくいのでサンプルコードを書きます。(あくまでサンプルなので、実際に使う場合はよくテストしてください。) 仮にVMが異常終了した場合でもロックはおそらく開放されます。(Windowsがプロセスの終了を検知するため) 万が一開放されなかった場合でも、Windowsの再起動で開放されます。 -------------------------------------------------------------------------------- import java.io.File; import java.io.FileOutputStream; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; public class Sample {      public static void main(String[] args) {          //起動チェック     final FileOutputStream fos = new FileOutputStream(new File("lock"));     final FileChannel fc = fos.getChannel();     final FileLock lock = fc.tryLock();     if (lock == null) {       //既に起動されているので終了する       return;     }          //ロック開放処理を登録     Runtime.getRuntime().addShutdownHook(       new Thread() {         public void run() {           if (lock != null && lock.isValid()) {             lock.release();           }           fc.close();           fos.close();         }       }     );          //処理を続行   } } -------------------------------------------------------------------------------- それから、#1さんのソケットを使う方法には以下の問題点があります。 ・メッセージの送受信(起動チェック)とリスン開始(ロック)の処理が分離されている (タイミング次第で多重起動可能) ・起動されていない場合(正常系)と何らかのエラーで返信が返ってこない場合(異常系)の区別ができない ・返信が無いというのはタイムアウトになるということであり、起動時間が多少長くなる 個人用のツールならともかく、業務システムに使用するのはお勧めできません。 #念の為に書いておきますが、回答を批判しているわけではありません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 今回は、「(2)ファイルチャネルのロックを利用する方法」を使わせていただきます。 java.util.logging.Loggerを使っていて、ファイルのロックの例はすぐ目の前にあったのですが、重複起動チェックに使用することまでは気付きませんでした。 タスクマネージャーでJavaプログラム起動中にjavaw.exeプロセスを終了する確認などもしてみました。 今のところ、この方法で特に問題はなさそうです。 非常に助かりました。ありがとうございました。

その他の回答 (1)

  • 回答No.1
  • TAKATON
  • ベストアンサー率62% (17/27)

>※ファイルに起動フラグを書出すという方法は考えてみましたが、 >クラッシュ(異常終了)したときに起動不可能になるためこの方法は使用 >できませんでした。 ならば、ソケット通信を使って、二重起動を監視してみてはいかがでしょうか? アプリケーション起動時にソケット通信を使って、他のアプリケーションへ メッセージを送信する。送信メッセージに対する返信がなければ、自分しか 起動されていないのでOK。返信があればNG。 自分しか起動されていないことがわかったら、次に、他のアプリケーションが 二重起動されるのを防ぐために、決められたポート番号でリスンする。 このポート番号に他のアプリケーションからメッセージが送信されてきた場合は、 既に起動済みである旨のメッセージを返す。 ただし、気をつけなければならないのは、決められたポートでリスンする処理は、 アプリのメインスレッドとは別のスレッドで行う必要があるということです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 今回はNo.2にgimmickさんから頂いた回答の「(2)ファイルチャネルのロックを利用する方法」を使うことにしました。 ソケット通信を使うことまでは気付きませんでした。 将来、別の機会に使うこともあるかもしれないので、動作確認のために実装を試みてみました。 その結果分かったことは、リスンのためにServerSocketでポートを開こうとすると、WindowsXP SP2の「Windowsファイアウォール」でブロックされてしまう場合もありそうです。 ※もしかしたらローカルホストに限定すればブロックされないのかもしれませんが、まだ深くは追求していません。 おかげ様で、問題解決方法の視野を広げることができました。 ありがとうございました。

関連するQ&A

  • Javaプログラムをサービスとして起動したい

    JavaのプログラムをWindowsのサービスとして起動したいと思っています。 ネットを調べてみると「Java Service Wrapper」などいくつか方法があるみたいですが、どうにもうまくいきません。 端的に、普段 "javaw -jar test.jar" で起動するコンパイル済みJAVAプログラムをサービス化するにはどうすればよいのでしょうか? お分かりになる方いらっしゃいましたらお願いします。 環境 OS: Windows 7 Professional 64bit CPU: AMD Phenom II Java: jdk1.6.0_23 (32bit) ※test.jarは改変せずにサービス化したいです ※ネットではタスクスケジューラと-Xrsオプションを使ってパソコン起動時にJavaを起動する方法も見受けられましたが、 タスクスケジューラは別件でエラーがでるので上手くいきません

  • Javaで作ったプログラムの実行方法

    Javaを勉強しているものです。 Javaで作ったプログラムを実行させる場合(テストなどではなくて)、Jarファイルにしてコマンドプロンプトから実行させるのが調べた中ではどうも一般的なようなのですが・・・。若しくはバッチファイルを作成して、そのアイコンをダブルクリックして実行など。 普通のソフトのように、アイコンをダブルクリックして実行できるような形にする方法はあるのでしょうか? ちなみに、作ったプログラムはCSV形式のデータを読み取る部分があり、実行時にそのファイルのありかを引数として与える必要があります。 ソフトを使えばEXEファイルに出来るようなのですが、そういったものを使用せずに出来る方法をご存知の方がいらっしゃいましたら、教えてください。

    • ベストアンサー
    • Java
  • javaアプリケーションの起動方法について

    通常WINDOWS上でJAVAアプリケーションのjarファイルをダブルクリックするとアプリケーションが立ち上がりますが、例えばシフトキーを押しながらダブルクリックして立ち上げるとGUIの表示を変えたりといった、条件分岐をしたいのですが、そもそもJAVAでこう言ったことが可能なのでしょうか?参考情報やサイトなどがあれば教えてください。

  • Java(jarファイル、開発方法、開発環境)について

    Javaの初心者です。 -状況- Jarファイルをもらいました。 そのファイルをダブルクリックすると、アプリケーションが起動します。 アプリケーションを変更したいので、Lhacaで解凍したら、classファイルがたくさん入っていました。classファイルは文字化けして読めません。 Eclipse, JBuilder, Textpadのどれかで開発しようと思っています。 (できればEclipse) -質問- 1、Javaプログラムは、classファイルだけでなくjavaファイルが必要だったと思うのですが、classファイルだけでも動くのですか? 2、jarファイルを解凍しないで、開発環境に取り込めますか? 3、Eclipse, Jbuilder, Textpadのどれが一番おすすめですか? 4、全部まとめると、このJavaプログラムを変更するには、どうすればいいですか? おバカな質問かもしれませんが、よろしくお願いします。

    • ベストアンサー
    • Java
  • Java 条件によって起動させない

    お世話になります 宜しくお願い致します。 JavaでGUIアプリケーションを開発しております。 そこで、 デスクトップ上にjarのショートカットをダブルクリックで起動し GUIアプリを最小化します。 その後もういちどデスクトップ上の同じショートカットをダブルクリックで起動したときに 既に起動されているjarを最小化状態から通常表示にする(2回目は起動させない) というようなことはできるのでしょうか できるのであれば、参考資料または検索エンジンでどうやったら上記の事象を検索できるか 教えて頂ければ大変ありがたいです。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • jarが実行できない

    JDKをインストールしていますが、jarファイルをダブルクリックしても Could not find the main class. Program will exit. と表示され実行できません。 コマンドプロンプトでは java -jar Sample.jar で実行できるのですが。 どうすればよいか教えてください。

  • javaのswingコンポーネントについて質問です。

    javaのswingコンポーネントについて質問です。 javaをやり始めて2ヶ月ぐらいたちました。 今までアプレットとアプリケーションの両方をやりこちらはできたのですが 「swing」を使用したアプレット(JApplet)だけがアプレットビューアやhtmlで開いても実行できません。 わかるかたできれば教えていただければ幸いです。 追記 実行できないのはソースファイルにJAppletで組んだプログラムだけです。 本に記載されたソースプログラムやインターネットに上がっているソースプログラムを実行してみましたが これらもJAppletを使用したものだけができませんでした。

  • jarファイル実行時の環境変数の設定

    Macでjavaプログラムを作成しており,jarファイルを作成しています. このjavaプログラムが,別のjavaプログラムのjarファイルを,外部コマンドとして呼び出しており,日本語(SHIFT_JIS)の入力を処理して,日本語(SHIFT_JIS)の出力をします. java7になって,jarファイルのダブルクリックで起動すると,この外部プログラムが,文字化けした出力を出すようになりました. SHIFT_JISのターミナル上で,java -jar AAA.jar のようにプログラムを起動したときには問題なく動作することと,javaのコードが6から7になって,SHIFT_JISからutf-8に変わったことから,外部プログラムの起動時に環境の文字コードがSHIFT_JISとして動作して欲しいところ,utf-8として処理してしまっていることが原因と考えられます. そこで,jarファイルのダブルクリックから起動する場合について,この外部プログラムの起動時に,動作環境の文字コードがSHIFT_JISとして認識される方法をご教示いただけないでしょうか.

    • ベストアンサー
    • Java
  • jarファイルの起動方法

    jarファイルを作成して、ダブルクリックで起動できる ようにしたいのですが、作成したjarファイルをクリックしても何の反応もありません。エラーメッセージが 出るわけでもなく、ただ、プログラムが実行されないのです。jarファイルの作成過程は以下のとおりです。 jar cf temp.jar testclass.class jar ufm temp.jar manifest.txt マニフェストファイルの最後には改行をいれてあります。

    • ベストアンサー
    • Java
  • Swingで作ったGUIで、ダブルクリックすると起動する方法

    普通、Swingで作ったGUIでは、コマンドプロンプトから起動しますが、VBなどで作ったGUIみたいにダブルクリックして起動するにはどうすればよろしいですか?

    • ベストアンサー
    • Java