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