簡體   English   中英

Runtime.exec 不會運行 javac,但命令行會

[英]Runtime.exec won't run javac, but command line will

在我的程序中,我創建了一個.java 文件,然后編譯它。 我使用的命令如下所示:

javac -classpath [path to main directory]\my.jar -d [path to main directory]\bin [path to main directory]\src\pkg1\MyClass.java

這是使用以下代碼調用的:

Runtime runtime = Runtime.getRuntime()
runtime.exec(command)

但是,當我通過單擊 Eclipse 中的“運行”來運行它時,出現以下錯誤:

java.io.IOException: Cannot run program "javac": CreateProcess error=2, 
    The system cannot find the file specified

現在,我知道這意味着什么:我沒有正確安裝 Java,我的路徑變量需要包含 JDK。 然而,這個簡單假設的問題在於,當我從命令行使用完全相同的命令時它工作得非常好(顯然不是runtime.exec() ,但仍然如此)。 我知道這不是我的 Java 安裝或命令本身的故障,因為否則它將無法從命令行運行,那么剩下什么以及如何修復它?

問題

您要求 JVM 運行名為“javac”的命令,但它失敗並出現錯誤:

java.io.IOException: Cannot run program "javac": CreateProcess error=2,
The system cannot find the file specified

解釋

JVM 不知道在哪里可以找到“javac”。 是否能夠自己運行“javac”與JVM是否也可以運行該命令是分開的。

重現行為

這是一個重現該行為的簡單程序——它嘗試運行“test.sh”:

String command = "test.sh";
Process process = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
System.out.println("command: [" + command + "] -- " + "output: [" + br.readLine() + "]");

運行該代碼將引發異常,因為 JVM 不知道在哪里可以找到“test.sh”:

java.io.IOException: Cannot run program "test.sh": error=2, No such file or directory

解決方案

事實上,我的計算機上確實有“test.sh”,但我之前沒有在 Java 程序中指定完整路徑(“/var/tmp”)。 該腳本非常簡單,它只運行“日期”命令:

% cat /var/tmp/test.sh
#!/bin/sh
date "+%Y-%m-%d"

% /var/tmp/test.sh 
2022-08-05

編輯命令使其使用“test.sh”的絕對路徑可以正常工作:

String command = "/var/tmp/test.sh";

command: [/var/tmp/test.sh] -- output: [2022-08-05]

示例: javac相同

這也適用於“javac”——這是來自命令"/usr/bin/javac -version"的 output:

command: [/usr/bin/javac -version] -- output: [javac 18.0.1.1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM