Java Runtime.getRuntime().exec("/bin/sh -c ant build") 拋出 ant: Permission denied,但 chmod 777 ant 且 build.xml 生成正常。
/usr/bin/ant 為 shell 腳本,內部調用 java -cp ... org.apache.tools.ant.Main。**執行腳本需目錄執行權限(x)**,僅文件 777 不夠,父目錄(/usr/bin、/usr/share/ant)也需可遍歷。ANT_HOME、JAVA_HOME 未在子進程環境中傳遞,導致腳本內部 java 命令找不到或 classpath 錯誤,拋出模糊的 Permission denied。exec 默認工作目錄為 Java 進程啟動目錄,若 build.xml 在其他路徑,ant 找不到構建文件。ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "ant build");
pb.directory(new File("/path/to/project/with/build.xml")); // 關鍵:指定工作目錄
pb.environment().put("ANT_HOME", "/usr/share/ant");
pb.environment().put("JAVA_HOME", "/usr/lib/jvm/java-11-openjdk");
pb.environment().put("PATH", "/usr/bin:/bin:/usr/sbin:/sbin:" + System.getenv("PATH"));
Process p = pb.start();
// 讀取 p.getInputStream()/getErrorStream() 避免緩衝區阻塞
int exit = p.waitFor();
exec 工具類,自動注入環境變量、工作目錄、流讀取線程、超時控制。Permission denied 多為環境變量/工作目錄/目錄執行權限綜合導致,**ProcessBuilder 精確控制上下文**是關鍵。