当我尝试扩展apache-maven
以使其支持外部下载程序而不检查校验和时,我发现了这个问题。
预期的外部下载程序为axel
,我的解决方案正在getTransfer
中重写transfer
和maven-wagon
方法,并在{{1}中添加用于检查checksums
的开关}}
一切正常,但aether-core
命令创建的axel
新子流程告诉我mvn
。
在我阅读了No state file, cannot resume!
的来源后,我发现它无法访问带有axel
标记的state
文件,该文件的扩展名为F_OK
并且应该在开头使用标记.st
创建。
我的代码如下:
O_CREAT | O_TRUNC | O_WRONLY
我想这可能是特权问题,目标目录的状态看起来像(PS:我是我机器中名为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:很抱歉因为axel
原因无法将文字粘贴到此编辑器中,我不知道为什么stackoverflow认为这个问题可能是spam
。
我的问题是我可以在JVM的子流程中创建新文件吗?如果可以的话,我应该如何设置权限?我还不知道这种方法有什么缺陷或缺陷吗?
任何建议都会受到赞赏,谢谢!
答案 0 :(得分:0)
所以这个问题很简单。真正的原因是传递给-o
的{{1}}选项。如果用户指定此选项,axel
将尝试加载以其原始名称的扩展名axel
命名的状态文件,该文件位于当前目录中。
但是,我试图从远程存储库下载全新的文件,并且当然没有这样的状态文件。
当我删除此选项时,所有事情都没有问题。