代码之家  ›  专栏  ›  技术社区  ›  Brad

Java-Runtime.exec()无法运行

  •  0
  • Brad  · 技术社区  · 6 年前

    String [] cmd = { "java", "-version" };
    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec(cmd);
    
    BufferedReader stdError = new BufferedReader( new InputStreamReader( process.getErrorStream() ) );
    String s = null;
    
    while ( ( s = stdError.readLine() ) != null )
        System.out.println(s);
    

    它工作得很好,但是如果我使用与Java应用程序捆绑在一起的JRE,我总是会收到错误,说Java是未知的:

    java.io.IOException: Cannot run program "java": error=2, No such file or directory
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
        at java.lang.Runtime.exec(Runtime.java:620)
        at java.lang.Runtime.exec(Runtime.java:450)
        at java.lang.Runtime.exec(Runtime.java:347)
        at org.runner.Runner.main(Runner.java:11)
    

    为什么在使用捆绑JRE时会发生这种情况?

    4 回复  |  直到 6 年前
        1
  •  2
  •   Brad    6 年前

    经过大量调查,我终于解决了这个问题。我将在这里添加我的工作解决方案,也许它会帮助有同样问题的人:

    此问题是由报告的JDK错误引起的: https://bugs.java.com/view_bug.do?bug_id=5049299

    由于我在Mac OS X上遇到了这个问题,所以通过设置Java System属性,我可以安全地使用“fork”而不是“posix_spawn”:

    if( isMacOSX() ) System.setProperty( "jdk.lang.Process.launchMechanism", "FORK" );
    

        2
  •  2
  •   Kevin    6 年前

    我在MacOS上也遇到了这个问题。它只在使用捆绑的jre时影响我的应用程序。而切换到“fork”(就像你在回答中所做的那样)对我很有效。我很好奇,一定有一个'更好的'解决方案,因为你指出的错误报告是存档和修复多年前。因此,在进一步挖掘之后,我发现,在MacOS上,捆绑的jre(../jre/Contents/Home/jre/lib/jspawnhelper)中有一个可执行文件,为了让Runtime.exec()工作,它必须是可执行的。不是这样的,但当我让它可执行时,我的进程就毫无错误地运行了。

    为了使其可执行,我在捆绑jre的功能中向build.properties文件中添加了以下内容:

    root.macosx.cocoa.x86_64.permissions.755=jre/Contents/Home/jre/lib/*

    您可能需要根据您的架构和jre位置对该行进行调整。

        3
  •  0
  •   S.K.    6 年前

    确保 java 添加到PATH环境变量。如果不是,则使用可执行文件的绝对路径。例如:

    String [] cmd = { "//usr//bin//java", "-version" };
    
        4
  •  -1
  •   Black4Guy    6 年前
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    

        public void pop(){
        String [] cmd = { "java", "-version" };
        Runtime runtime = Runtime.getRuntime();
        Process process = null;
        try {
            process = runtime.exec(cmd);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    
        BufferedReader stdError = new BufferedReader( new InputStreamReader( process.getErrorStream() ) );
        String s = null;
    
        try {
            while ( ( s = stdError.readLine() ) != null )
                System.out.println(s);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
            public static void main(String []args){
                PP pp=new PP();
            pp.pop();
            }
    

    }