2 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
這與 JAR 文件的執(zhí)行權(quán)限無(wú)關(guān)。實(shí)際上,JAR 文件只需要可讀即可。
如果您的問(wèn)題的標(biāo)題是準(zhǔn)確的,這與 Java 程序是否能夠讀取和執(zhí)行您正在談?wù)摰?strong>shell 腳本有關(guān):
shell 腳本本身必須可由試圖運(yùn)行它們的有效用戶執(zhí)行。例如,腳本本身需要設(shè)置相關(guān)的執(zhí)行位。
shell 腳本的路徑需要從根目錄一直讀?。ㄓ捎行в脩?.....)。(或當(dāng)前目錄,如果您使用的是相對(duì)于點(diǎn)的相對(duì)路徑名?;蛘吣夸?$PATH ... 如果您使用的是簡(jiǎn)單的命令名稱。)
奇怪的是,這段代碼根本不是試圖運(yùn)行 shell 腳本。那是一個(gè)簡(jiǎn)單的java
命令。不涉及 shell 腳本。
如果失敗并出現(xiàn)“權(quán)限被拒絕”錯(cuò)誤,則該java
命令不可執(zhí)行,或者 JAR 文件不可讀。
我認(rèn)為您需要向我們提供更多信息;例如所有相關(guān)的輸出、真實(shí)的代碼和真實(shí)的文件/目錄名稱和權(quán)限。
我的程序首先嘗試導(dǎo)航(通過(guò) CD)到包含 JAR 文件本身的目錄:
我假設(shè)您意識(shí)到您的嘗試:
String[] cd = {jarDirectory.getAbsolutePath(), "cd"}; Runtime.getRuntime().exec(cd);
不起作用。它更改子進(jìn)程的當(dāng)前目錄,但這對(duì)父進(jìn)程或您運(yùn)行的下一個(gè)子進(jìn)程沒(méi)有影響。您應(yīng)該使用ProcessBuilder
它directory(File)
,特別是它可用于為子進(jìn)程選擇不同的當(dāng)前目錄。
這意味著您可能位于錯(cuò)誤的目錄中,這可能會(huì)導(dǎo)致“權(quán)限被拒絕”問(wèn)題。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
我不知道為什么這會(huì)導(dǎo)致權(quán)限被拒絕,但這應(yīng)該是
String[] jarCommand = {"java", "-jar", "some-jar-SNAPSHOT.jar"};
否則,exec 調(diào)用將查找名為“java -jar some-jar-SNAPSHOT.jar”的可執(zhí)行文件,盡管我希望這會(huì)導(dǎo)致 ENOENT 而不是 EPERM。
添加回答
舉報(bào)