如何防止对可执行jar的多次点击

时间:2012-11-26 10:29:17

标签: java

我有一个可执行jar,它运行带有内部SqlLite数据库的Java Swing应用程序。 用户(错误地)不仅仅是点击jar,导致db锁定。 我想防止这种行为。 我能做什么? 非常感谢你

3 个答案:

答案 0 :(得分:1)

您需要某种同步机制。

您需要自己编写代码,或者您可以为您的应用程序创建Java WebStart配置,其中Java WebStart可以通过单实例服务(您必须在代码中明确调用)处理“仅一次调用”。

有关示例,请参阅http://docs.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/examples.html#SingleInstanceService

答案 1 :(得分:0)

访问db的第一个实例应该在db上获取某种锁,并且所有其他实例应该首先检查是否已存在这样的锁。如果有一个 - > “我不是第一个,显示警告/错误,退出。”,如果没有“我是第一个,请锁定,继续。”

答案 2 :(得分:0)

您可以使用JPS或JNI(需要在不同平台上实施)。附件是用于检查Java应用程序实例的JPS代码。您可以将其修改为更多OO。

使用文件,套接字或注册表作为锁定并不完美,因为错误操作很可能会导致您的应用程序无法再启动(例如,另一个程序占用相同的端口)


import java.io.*;

public class TestRun {

      public TestRun() {}



      public static void main(String args[]) {



            String jpsApp = "jps -mlvV";
            int count = 0;
            try {

                  Process p = Runtime.getRuntime().exec(jpsApp);
                  //parser the result to check if TestAPP is running

                  InputStream is = p.getInputStream();

                  BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                  String line = null;

                  while ((line = reader.readLine()) != null) {

                        System.out.println();

                        System.out.println(line);

                        String[] pair = line.split(" ");

                        if (pair.length >= 2) {

                              System.out.println("name is " + pair[1]);

                              if (pair[1].trim().indexOf("TestRun") > -1) {

                                    count++;

                                    System.out.println("count is " + count);

                              }

                        }

                  }
                  //it is running, just exit the second instance

                  if(count>1){


                        System.out.println("Has run a application!");
                        return;

                  } 

            } catch (Exception ex) {

                  ex.printStackTrace();

            }


      }

}