繁体   English   中英

Java-Runtime.exec()无法运行

[英]Java - Runtime.exec() fails to run

当我尝试运行任何Runtime.exec()命令(例如此简单命令)以打印Java版本时:

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时会发生这种情况?

经过大量调查,我能够解决此问题。 我将在此处添加我的工作解决方案,可能会帮助遇到相同问题的人:

此问题是由于以下报告的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" );

这可能是一个不受欢迎的解决方案,但对于Mac OS X而言,它确实为我解决了一个巨大的问题。

我也在MacOS上遇到了这个问题。 它仅在使用捆绑的jre时影响我的应用程序。 在切换到“叉子”时(就像您在回答中所做的那样)对我有用。 我很好奇,因为您指出的错误报告是在多年前提交并修复的,所以肯定有一个“更好”的解决方案。 因此,在进行更多挖掘之后,我发现在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的位置对该行进行调整。

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

String [] cmd = { "//usr//bin//java", "-version" };
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

公共课程PP {

    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();
        }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM