調(diào)試代碼時(shí)發(fā)現(xiàn)一個(gè)很奇怪的問(wèn)題,本地通過(guò)java執(zhí)行命令行時(shí)沒(méi)有報(bào)錯(cuò)
log.info("commendStr={}",commandStr);
Process p = Runtime.getRuntime().exec(commandStr, null , new File(cmdPath));
if(p !=null){
p.getOutputStream().close();
}
br =new BufferedReader(new InputStreamReader(p.getInputStream()));
String line =null;
StringBuilder sb =new StringBuilder();
while ((line = br.readLine()) !=null) {
sb.append(line +"\n");
}
int i = p.waitFor();
log.info("process wait for return --->{}",i);
主要功能是執(zhí)行commandStr? ? 的命令?
但是通過(guò)jekins發(fā)布項(xiàng)目到其他機(jī)器會(huì)發(fā)現(xiàn)無(wú)法識(shí)別commandStr中的命令巫员,在部署的機(jī)器上查看path環(huán)境變量也沒(méi)發(fā)現(xiàn)問(wèn)題诅挑,將命令單獨(dú)在機(jī)器上運(yùn)行也沒(méi)問(wèn)題
通過(guò)jekins編寫(xiě)了一個(gè)shell腳本 直接執(zhí)行? shell中的命令為查詢(xún)path 發(fā)現(xiàn)執(zhí)行出來(lái)的結(jié)果和機(jī)器上查詢(xún)出來(lái)的結(jié)果不一致四敞,重啟jekins后代碼能正常運(yùn)行
由此初步得出結(jié)論 jekins啟動(dòng)后將path環(huán)境變量寫(xiě)入了自己緩存中,外部機(jī)器path改動(dòng)并不會(huì)導(dǎo)致jekins刷新緩存變量拔妥,如果代碼中有使用命令行依賴(lài)path的需要特別注意:加入到path時(shí)間和jekins的啟動(dòng)時(shí)間前后關(guān)系