Java程序运行时的ClassPath没有处理好,这个的话用ProcessBuilder会更方便。
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;public class ProcessBuilderTest {
    public static void main(String[] args) throws IOException {
        ProcessBuilder pb = new ProcessBuilder("java", "Test2");
        pb.directory(new File("/Users/Biao/Desktop/")); // 关键在这里
        Process p = pb.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        System.out.println("End");
    }
}

解决方案 »

  1.   

    补充:单独去执行脚本里的指令是可以用的;将脚本稍加修改成bat的格式放到windows下也完全可用。
    为了验证是否是我代码的问题,我将那段调用shell的代码单独拿出来,写了个测试类:public class Testbat {
    public static void main(String args[]){
    String cmd="/usr/local/tomcat/apache-tomcat-7.0.39/webapps/oops/Oops/33/test_all_mid_5361d7f8-2766-4672-9941-b106ec400685/Answer/1120120745/Tarantula/project/runJava.sh";//此为那个shell所在的目录
    String s2;
    try {
    Process process=Runtime.getRuntime().exec(cmd);
    BufferedReader bufferedReader2=new BufferedReader((new InputStreamReader(process.getInputStream())));
    while((s2=bufferedReader2.readLine())!=null)
    System.out.println(s2);
    process.waitFor();
    process.destroy();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    然后去执行这段代码,最后得到了正确的结果。这让我很莫名其妙,单独去执行就可用,通过服务器调用就会出现上述异常,实在不懂了,求各位大虾帮帮忙。
      

  2.   

    我也感觉是classpath的问题,可是看我2楼那段代码,经测试是可用的啊,为什么一经过服务器去执行就不行了呢,还请二狗哥明示。
      

  3.   

    Working Directory的问题。
    1. cd xxx
    2. java yyy不能用绝对路径执行java的class,必须进入class所在的目录才能执行:  java /A/B/yyy
      

  4.   

            ProcessBuilder pb = new ProcessBuilder("java", "Test2");
            pb.directory(new File("/Users/Biao/Desktop/")); // 关键在这里这也是这里第一句是 java Test2
    而第二句指定directory的原因所在
    以前做浏览器上传代码到服务器编译,然后在服务器上执行,然后返回执行结果,正好用到这个功能,这也是那是记的笔记。
      

  5.   

    类名就是public  class  xxoo文件名就是ooxx.java
      

  6.   

    我理解您说的,我是将需要执行的javac和java指令写成shell文件,然后直接调用执行。shell脚本是先进入java文件所在的目录,然后再编译执行的。并且编译这部已经运行成功,生成class文件了。
      

  7.   

    我将我的代码改为这样//ProcessBuilder pb=new ProcessBuilder("java","Main","A","3","4","5");
    ProcessBuilder pb=new ProcessBuilder("java","Main","A","3","4","5");
    pb.directory(new File("/usr/local/tomcat/apache-tomcat-7.0.39/webapps/oops/Oops/33/test_all_mid_5361d7f8-2766-4672-9941-b106ec400685/Answer/1120120745/Tarantula/project/src"));
    Process process=pb.start();
    经检测,在windows下可用,在linux下单独执行这段java也可用,但是在linux下通过tomcat执行就报错:Exception in thread "main" java.lang.NoClassDefFoundError: Main
    this is getErrorStream:
    Caused by: java.lang.ClassNotFoundException: Main
    this is getErrorStream:
            at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    this is getErrorStream:
            at java.security.AccessController.doPrivileged(Native Method)
    this is getErrorStream:
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    this is getErrorStream:
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    this is getErrorStream:
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    this is getErrorStream:
            at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    this is getErrorStream:
    Could not find the main class: Main.  Program will exit.求解这是怎么回事呢