當我嘗試擴展apache-maven
以使其支持外部下載程序而不檢查校驗和時,我發現此問題。爲什麼我無法在JVM子進程中打開一個新文件?
的預期的外部下載是axel
和我的溶液改寫maven-wagon
getTransfer
和transfer
方法以及用於檢查aether-core
加入checksums
開關。
除了由mvn
命令創建的新子過程axel
告訴我No state file, cannot resume!
以外,所有工作都正常。
我讀過的axel
源之後,我想它,它meaned無法訪問state
文件,標誌F_OK
,它總是與擴展.st
,應標誌O_CREAT | O_TRUNC | O_WRONLY
在開始創建。
我的代碼如下:
protected void transfer(Resource resource, String url, File output, int requestType) throws IOException {
byte[] buffer = new byte[0];
TransferEvent transferEvent = new TransferEvent(this, resource, 3, requestType);
transferEvent.setTimestamp(System.currentTimeMillis());
Runtime runtime = Runtime.getRuntime();
ArrayList cmdLine = new ArrayList(DOWNLOADER);
cmdLine.add(output.getAbsoluteFile().getAbsolutePath());
cmdLine.add(url);
File parent = output.getParentFile();
if(!parent.exists()) {
parent.mkdirs();
}
Process process = runtime.exec((String[])cmdLine.toArray(new String[cmdLine.size()]), (String[])null, parent);
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String stdout = br.readLine();
float progress = 0.0F;
for(float previous = 0.0F; stdout != null; stdout = br.readLine()) {
Matcher matcher = PATTERN.matcher(stdout);
if(matcher.matches()) {
String stringProgress = matcher.group(1);
progress = Float.valueOf("0." + stringProgress).floatValue();
this.fireTransferProgress(transferEvent, buffer, Float.valueOf((float)resource.getContentLength() * (progress - previous)).intValue());
previous = progress;
}
}
br.close();
if(progress != 100.0F) {
StringBuilder sb = new StringBuilder();
br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
for(String stderr = br.readLine(); stderr != null; stderr = br.readLine()) {
sb.append(stderr);
}
if(sb.length() > 0) {
this.fireTransferError(resource, new Exception(sb.toString()), 5);
}
}
}
我想這可能是特權的問題,和目標目錄的狀態看起來像(PS:我在我的機器名爲simple
用戶):
PS:對不起,無法將文本粘貼到該編輯器spam
原因,我不知道爲什麼計算器認爲這個問題可能會是spam
。
我的問題是我可以在JVM的子流程中創建一個新文件嗎?如果可以,我應該如何設置特權?那麼我還不知道這種方法有什麼缺陷或缺陷?
任何建議將不勝感激,謝謝!