千里冰封
JAVA 浓香四溢
posts - 151,comments - 2801,trackbacks - 0
在程序运行的过程中,我们可能需要更改一些配置,如果配置更改得很大的话,就可能会需要程序重新启动,但是JAVA并没有提供给我们直接的可以重启的方法.在这里我们将利用JDK1.5新增的ProcessBuilder来创建一个重启进程,然后自己的进程退出.

简单 代码如下:
/*
 * Test3.java
 * 
 * Created on 2007-9-27, 11:46:31
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/

package test2;

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

/**
 *
 * 
@author hadeslee
 
*/
public class Test3 {
    
public static void restart() throws IOException{
        
//用一条指定的命令去构造一个进程生成器
        ProcessBuilder pb=new ProcessBuilder("java","-jar","Test3.jar");
        
//让这个进程的工作区空间改为F:\dist
        
//这样的话,它就会去F:\dist目录下找Test.jar这个文件
        pb.directory(new File("F:\\dist"));
        
//得到进程生成器的环境 变量,这个变量我们可以改,
        
//改了以后也会反应到新起的进程里面去
        Map<String,String> map=pb.environment();
        Process p
=pb.start();
        
//然后就可以对p做自己想做的事情了
        
//自己这个时候就可以退出了
        System.exit(0);
    }
}

在这里我们利用了ProcessBuilder这个类,这个类是一个进程的生成类,我们在起动一个进程之前可以设置好相关的一些参数,比如工作目录,环境变量等等,但是设置环境变的时候,有一个需要注意的地方就是你设置的环境变量不会改变系统原来的环境变量.也就是说即使你把path设为空,这个进程的运行的时候,依然是读取系统的path找到java这个命令,否则的话,你把path设为空,java命令是不可能找得到的.
一般来说ProcessBuilder这个类都是在万不得已的情况下才用的,因为用了它以后,程序很难保证可移植性,除非你在每个平台上都找到相应的命令执行相应的事情.


尽管千里冰封
依然拥有晴空

你我共同品味JAVA的浓香.
posted on 2007-09-27 11:55 千里冰封 阅读(8466) 评论(2)  编辑  收藏 所属分类: JAVASE

FeedBack:
# re: 利用ProcessBuilder实现JAVA程序的重启
2009-01-19 22:58 | 游客
在myEclpise环境下,这种方法怎么不行?!例如,我在MyEclipse环境下给出的两个程序:package multipleProcess;

/*
* Test3.java
*
* Created on 2007-9-27, 11:46:31
*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

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

/**
*
* @author hadeslee
*/
public class test3 {
public static void main(String[] args) throws IOException{
//用一条指定的命令去构造一个进程生成器
ProcessBuilder pb=new ProcessBuilder("java","test2");

pb.start();
//让这个进程的工作区空间改为F:\dist
//这样的话,它就会去F:\dist目录下找Test.jar这个文件
//pb.directory(new File("d:\\dist"));
//得到进程生成器的环境 变量,这个变量我们可以改,
//改了以后也会反应到新起的进程里面去
Map<String,String> map=pb.environment();
Process p=pb.start();
//然后就可以对p做自己想做的事情了
//自己这个时候就可以退出了
System.exit(0);
}
}
package multipleProcess;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
*
* @author hadeslee
*/
public class test2 extends JPanel{

private JTextField input;
private JButton go;

public test2() {
super(new BorderLayout());
initWindow();
}

private void initWindow() {
try {

go = new JButton("转到");
input = new JTextField();
JPanel up = new JPanel(new BorderLayout());
up.add(input, BorderLayout.CENTER);
up.add(go, BorderLayout.EAST);
this.add(up, BorderLayout.NORTH);

} catch (Exception ex) { }
JFrame jf = new JFrame("JAVA浏览器");
jf.add(this, BorderLayout.CENTER);
jf.setSize(500, 300);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent ae) {
doOpen();
}

private void doOpen() {
// try {
String text = input.getText();
if (text == null || text.equals("")) {
return;
}
if (!text.toLowerCase().startsWith("http://")) {
text = "http://" + text;
}
/* } catch (MalformedURLException ex) {
Logger.getLogger(Test1.class.getName()).log(Level.SEVERE, null, ex);
}*/
}

public static void main(String[] args) {
new test2();

}
}

当然,上面的两个程序,去掉package之后,在命令行下能得到预期结果,但在MyEclipse环境下,就得不到预期结果!
  回复  更多评论
  
# re: 利用ProcessBuilder实现JAVA程序的重启
2009-01-19 22:59 | 千里冰封
@游客
因为myEclipse改变了程序运行的进程目录  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: