2016-07-28 26 views
0

当我尝试扩展apache-maven以使其支持外部下载程序而不检查校验和时,我发现此问题。为什么我无法在JVM子进程中打开一个新文件?

的预期的外部下载是axel和我的溶液改写maven-wagongetTransfertransfer方法以及用于检查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用户): enter image description here

国家mvn命令: enter image description here

命令axel的状态是: enter image description here

PS:对不起,无法将文本粘贴到该编辑器spam原因,我不知道为什么计算器认为这个问题可能会是spam

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

任何建议将不胜感激,谢谢!

回答

0

所以问题变得很简单。真正的原因是-o选项传递给axel。如果用户指定此选项,axel将尝试加载位于当前目录中的名称为扩展名为.st的原始名称的状态文件。

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

当我删除这个选项,所有的事情都很好。

相关问题