簡體   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