当我尝试扩展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的子流程中创建一个新文件吗?如果可以,我应该如何设置特权?那么我还不知道这种方法有什么缺陷或缺陷?
任何建议将不胜感激,谢谢!