首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Ubuntu 下 Java 調用 Ant 打包報 Permission Denied 根因與修復

     編輯:程式設計疑難解答

現象

Java Runtime.getRuntime().exec("/bin/sh -c ant build") 拋出 ant: Permission denied,但 chmod 777 ant 且 build.xml 生成正常。

根因分析

  1. ant 是腳本而非二進制: /usr/bin/ant 為 shell 腳本,內部調用 java -cp ... org.apache.tools.ant.Main。**執行腳本需目錄執行權限(x)**,僅文件 777 不夠,父目錄(/usr/bin、/usr/share/ant)也需可遍歷。
  2. 環境變量缺失: ANT_HOME、JAVA_HOME 未在子進程環境中傳遞,導致腳本內部 java 命令找不到或 classpath 錯誤,拋出模糊的 Permission denied。
  3. 工作目錄錯誤: 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();

最佳實踐建議

  • **避免在 Java 中調用外部構建工具**,改用 **Gradle/Maven 插件** 或 **Gradle Tooling API** 在進程內構建,消除環境依賴與權限問題。
  • 若必須調用,統一封裝 exec 工具類,自動注入環境變量、工作目錄、流讀取線程、超時控制。
  • 容器化部署時,構建環境鏡像預裝 Ant/Gradle/Maven,入口腳本直接調用,不依賴宿主機配置。

Permission denied 多為環境變量/工作目錄/目錄執行權限綜合導致,**ProcessBuilder 精確控制上下文**是關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved