为什么我无法在JVM子流程中打开新文件?

时间:2016-07-28 01:25:02

标签: java maven

当我尝试扩展apache-maven以使其支持外部下载程序而不检查校验和时,我发现了这个问题。

预期的外部下载程序为axel,我的解决方案正在getTransfer中重写transfermaven-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); } } } 的用户): enter image description here

simple命令的状态: enter image description here

命令状态mvn是: enter image description here

PS:很抱歉因为axel原因无法将文字粘贴到此编辑器中,我不知道为什么stackoverflow认为这个问题可能是spam

我的问题是我可以在JVM的子流程中创建新文件吗?如果可以的话,我应该如何设置权限?我还不知道这种方法有什么缺陷或缺陷吗?

任何建议都会受到赞赏,谢谢!

1 个答案:

答案 0 :(得分:0)

所以这个问题很简单。真正的原因是传递给-o的{​​{1}}选项。如果用户指定此选项,axel将尝试加载以其原始名称的扩展名axel命名的状态文件,该文件位于当前目录中。

但是,我试图从远程存储库下载全新的文件,并且当然没有这样的状态文件。

当我删除此选项时,所有事情都没有问题。