Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java重启应用程序方法只重启一次?_Java_Dynamic Data_Application Restart - Fatal编程技术网

java重启应用程序方法只重启一次?

java重启应用程序方法只重启一次?,java,dynamic-data,application-restart,Java,Dynamic Data,Application Restart,我试图使用在堆栈溢出上找到的restartApplication方法,但由于某些原因,它只会重新启动我的应用程序一次。例如,在下面这个简单的JOptionPane程序中,如果用户输入字母“a”,它将重新启动程序。一旦程序重新启动,如果用户再次输入“a”,它将终止执行。我如何使它能够连续地重新启动 我添加了一些println()语句以查看是否可以获得更多信息,它只是确认在我第二次键入字母“a”后程序即将结束 import java.io.File; import java.io.IOExcepti

我试图使用在堆栈溢出上找到的restartApplication方法,但由于某些原因,它只会重新启动我的应用程序一次。例如,在下面这个简单的JOptionPane程序中,如果用户输入字母“a”,它将重新启动程序。一旦程序重新启动,如果用户再次输入“a”,它将终止执行。我如何使它能够连续地重新启动

我添加了一些println()语句以查看是否可以获得更多信息,它只是确认在我第二次键入字母“a”后程序即将结束

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.JOptionPane;


public class JOptionTest{
public static void restartApplication()
{
  final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
  final File currentJar = new File("C:\\Documents and Settings\\My Documents\\hello3.jar");//UpdateReportElements.class.getProtectionDomain().getCodeSource().getLocation().toURI());

  /* is it a jar file? */
  if(!currentJar.getName().endsWith(".jar"))
    return;

  /* Build command: java -jar application.jar */
  final ArrayList<String> command = new ArrayList<String>();
  command.add(javaBin);
  command.add("-jar");
  command.add(currentJar.getPath());

  final ProcessBuilder builder = new ProcessBuilder(command);
  try {
    builder.start();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
  System.exit(0);
}


public static void main(String[] args){
    String str = JOptionPane.showInputDialog(null, "Enter some text",1);
    System.out.println(str);
    //String a= "a";
    if (str.equals("a")){
        System.out.println(str+ "right about to restart");
        restartApplication();
    }
}
}
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入javax.swing.JOptionPane;
公共类作业测试{
公共静态void restartApplication()
{
最后一个字符串javaBin=System.getProperty(“java.home”)+File.separator+“bin”+File.separator+“java”;
最终文件currentJar=新文件(“C:\\Documents and Settings\\My Documents\\hello3.jar”);//UpdateReportElements.class.getProtectionDomain().getCodeSource().getLocation().toURI());
/*是jar文件吗*/
如果(!currentJar.getName().endsWith(“.jar”))
返回;
/*Build命令:java-jarapplication.jar*/
final ArrayList命令=new ArrayList();
add(javaBin);
add(“-jar”);
add(currentJar.getPath());
最终ProcessBuilder=新的ProcessBuilder(命令);
试一试{
builder.start();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
系统出口(0);
}
公共静态void main(字符串[]args){
String str=JOptionPane.showInputDialog(null,“输入一些文本”,1);
系统输出打印项次(str);
//字符串a=“a”;
如果(str.equals(“a”)){
System.out.println(str+“即将重新启动”);
重启应用程序();
}
}
}
看到这行了吗

系统出口(0)

您只调用了一次restartApplication,当它结束时,您将退出java进程

如果要连续重新启动,请删除此行,并可能永远迭代:

 public static void restartApplication()
 {
  while(true){

       final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
       final File currentJar = new File("C:\\Documents and Settings\\XBBKKYL\\My      Documents\\hello3.jar");//UpdateReportElements.class.getProtectionDomain().getCodeSource().get           Location().toURI());

      /* is it a jar file? */
     if(!currentJar.getName().endsWith(".jar"))
       return;

   /* Build command: java -jar application.jar */
    final ArrayList<String> command = new ArrayList<String>();
    command.add(javaBin);
    command.add("-jar");
    command.add(currentJar.getPath());

    final ProcessBuilder builder = new ProcessBuilder(command);
    try {
        builder.start();
    } catch (IOException e) {
       e.printStackTrace();
    }
  }
}
publicstaticvoidrestartapplication()
{
while(true){
最后一个字符串javaBin=System.getProperty(“java.home”)+File.separator+“bin”+File.separator+“java”;
最终文件currentJar=新文件(“C:\\Documents and Settings\\XBBKYL\\My Documents\\hello3.jar”);//UpdateReportElements.class.getProtectionDomain().getCodeSource().get Location().Tori());
/*是jar文件吗*/
如果(!currentJar.getName().endsWith(“.jar”))
返回;
/*Build命令:java-jarapplication.jar*/
final ArrayList命令=new ArrayList();
add(javaBin);
add(“-jar”);
add(currentJar.getPath());
最终ProcessBuilder=新的ProcessBuilder(命令);
试一试{
builder.start();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
我没有测试过,这只是一个想法,看到这行了吗

系统出口(0)

您只调用了一次restartApplication,当它结束时,您将退出java进程

如果要连续重新启动,请删除此行,并可能永远迭代:

 public static void restartApplication()
 {
  while(true){

       final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
       final File currentJar = new File("C:\\Documents and Settings\\XBBKKYL\\My      Documents\\hello3.jar");//UpdateReportElements.class.getProtectionDomain().getCodeSource().get           Location().toURI());

      /* is it a jar file? */
     if(!currentJar.getName().endsWith(".jar"))
       return;

   /* Build command: java -jar application.jar */
    final ArrayList<String> command = new ArrayList<String>();
    command.add(javaBin);
    command.add("-jar");
    command.add(currentJar.getPath());

    final ProcessBuilder builder = new ProcessBuilder(command);
    try {
        builder.start();
    } catch (IOException e) {
       e.printStackTrace();
    }
  }
}
publicstaticvoidrestartapplication()
{
while(true){
最后一个字符串javaBin=System.getProperty(“java.home”)+File.separator+“bin”+File.separator+“java”;
最终文件currentJar=新文件(“C:\\Documents and Settings\\XBBKYL\\My Documents\\hello3.jar”);//UpdateReportElements.class.getProtectionDomain().getCodeSource().get Location().Tori());
/*是jar文件吗*/
如果(!currentJar.getName().endsWith(“.jar”))
返回;
/*Build命令:java-jarapplication.jar*/
final ArrayList命令=new ArrayList();
add(javaBin);
add(“-jar”);
add(currentJar.getPath());
最终ProcessBuilder=新的ProcessBuilder(命令);
试一试{
builder.start();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}

我没有测试过这个,它只是一个想法

这在这个程序上非常有效。当我在我的实际程序中注释掉那一行时(确定它太长,无法在堆栈溢出上发布),它会重新启动任意次数,但它永远不会关闭旧实例。你知道如何让它关闭旧实例吗?我想如果它实际上没有关闭旧的实例,从技术上讲它是不会重新启动的。@davidVee ProcessBuilder中的start()方法创建了一个新的进程,您可以在该进程上调用destroy()。这在这个程序上非常有效。当我在我的实际程序中注释掉那一行时(确定它太长,无法在堆栈溢出上发布),它会重新启动任意次数,但它永远不会关闭旧实例。你知道如何让它关闭旧实例吗?我想,如果它实际上没有关闭旧实例,从技术上讲就不会重新启动。@davidVee ProcessBuilder中的start()方法创建了一个新进程,您可以对该进程调用destroy()。为什么要创建一个新进程来运行另一个Java应用程序?这有一股难闻的味道。也许我被误解了。混合中只有一个Java应用程序。为什么要创建一个新进程来运行另一个Java应用程序?这有一股难闻的味道。也许我被误解了。混合中只有一个Java应用程序。