如题,想通过界面按钮启动另外一个后台进程。目前的做法是Process process = Runtime.getRuntime().exec(".\\x.bat");x.bat是用来启动进程的批处理文件,我想问的是,是否可以直接调用java.exe 指明mainclass来启动子进程,我试来试去都没成功,大家帮忙。

解决方案 »

  1.   

    不一定要用java.exe,多个Java的程序可以在一个虚拟机进程上跑,你可以研究一下ClassLoader的东西。如果想用java.exe,那么实际和你用.bat文件是没有区别的。
      

  2.   

    楼上正解。既然bat可以起,直接调java.exe也肯定可以的。譬如Runtime.getRuntime().exec("java CompiledClass");只要你在控制台能把要起的程序起起来,把命令复制为参数就OK了。
      

  3.   

    给大家看一下我的测试代码吧
    public class TestRuntime {
    public static void main(String arg[]){
    String s = null;
    try {
    Process process = Runtime.getRuntime().exec("java  test.Test");
    //Process process = Runtime.getRuntime().exec(".\\test.bat");
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    while((s=bufferedReader.readLine()) != null)
    System.out.println(s);
    process.waitFor();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println("finish");
            
    }
    }
    其中test.bat的内容为java  -cp ./bin test.Test &
    test.Test只是System.out.println("Hello World~~~"); 而已
    现在的问题是,执行Process process = Runtime.getRuntime().exec(".\\test.bat");可以得到如下输入D:\program_design\zjcc_project\RuntimeExec>java  -cp ./bin test.Test  
    Hello World~~~
    finish而执行Process process = Runtime.getRuntime().exec("java  test.Test");只是得到
    finish
      

  4.   

    你可以把process的errorStream取出来打印,应该是提示类找不到的错误的,你需要在Runtime.getRuntime().exec("java     test.Test"); 执行命令里设置classpath。
      

  5.   

    手动在命令行运行一下
    java test.Test
    看看有无问题import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;public class Test {
        public static void main(String arg[]) {
            String s = null;
            try {
                Process process = Runtime.getRuntime().exec("java test.Test1");
               //  Process process = Runtime.getRuntime().exec(".\\test.bat");
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(process.getInputStream()));
                while ((s = bufferedReader.readLine()) != null)
                    System.out.println(s);
                process.waitFor();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("finish");
        }
    }/*
    Hello World!!!
    finish
    */我运行过 没问题
      

  6.   

    Process process = Runtime.getRuntime().exec("java -cp ./bin test.Test");试试。
      

  7.   

    当用exec方法调用java.exe或其它可执行程序的时候,一定要使用下面的格式:Process process = Runtime.getRuntime().exec("cmd /C java -cp ./bin test.Test");如果没有标红色的部分,是不会执行正确的
      

  8.   

    能解释下么?感觉不加也应该没问题。在XP里打cmd /?得到的解释
    [code=BatchFile]CMD命令 Starts a new instance of the Windows XP command interpreter
    /C  Carries out the command specified by string and then terminates
    [/code]
      

  9.   

    回 cyberpeng具体原因不清楚,我在XP下不用cmd /c执行不成功,用了就成功,猜测可能的原因是
    使用了cmd /c 后才能够正确的使用系统的PATH环境变量,找到相应的执行程序。
      

  10.   

    崩溃了,直接通过命令行 java test.Test没有问题,有HelloWorld打印出来的,但是Runtime.getRuntime().exec("java  test.Test");就是没有结果,只在最后打出一个finish.楼上大家说的我也都试过,奇怪奇怪!贴出完整代码:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.URL;
    public class TestRuntime {
    public static void main(String arg[]){

    String s = null;
    try {


    Process process = Runtime.getRuntime().exec("java  test.Test");
    //Process process = Runtime.getRuntime().exec(".\\test.bat");
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    while((s=bufferedReader.readLine()) != null)
    System.out.println(s);
    process.waitFor();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println("finish");
            
    }
    }
    package test;public class Test {
    public static void main(String args[]){
    System.out.println("Hello World~~~");
    }
    }
      

  11.   

    try{
       //execl.exe是你的excel进程
       Runtime.getRuntime().exec("taskkill /IM execl.exe");   //test.xls是你的文件
       Runtime.getRuntime().exec("del D:/test.xls");
    }catch(Excepiton e){}