title: Add files and repertories to a Tar archive with Apache Commons Compress library in non machine dependent way
body: <p>I'm working on an application that need to create a tar archive in order to calculate his hash.
  But I encounter some problems :</p>
  
  <ul>
  <li>the tar is not the same in different machine, then the hash calculated is different</li>
  <li>I'm not able to add directories properly</li>
  <li>If I add an zip file, at the end, in the tar, I have the content off my zip file  :/</li>
  </ul>
  
  <p>I have read different post in SO and the dedicated tutorial on apache, and also the source test code of the apache commons compress jar, but I don't get the right solution.</p>
  
  <p>Are there anybody that can find where my code is not correct ?</p>
  
  <pre><code>    public static File createTarFile(File[] files, File repository) {
      File tarFile = new File(TEMP_DIR + File.separator + repository.getName() + Constants.TAR_EXTENSION);
      if (tarFile.exists()) {
          tarFile.delete();
      }
  
      try {
          OutputStream out = new FileOutputStream(tarFile);
  
          TarArchiveOutputStream aos = (TarArchiveOutputStream) new ArchiveStreamFactory().createArchiveOutputStream("tar", out);
  
          for(File file : files){
              Utilities.addFileToTar(aos, file, "");
          }
  
          aos.finish();
          aos.close();
          out.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
  
      return tarFile;
  }
  
  private static void addFileToTar(TarArchiveOutputStream tOut, File file, String base) throws IOException {
  
      TarArchiveEntry entry = new TarArchiveEntry(file, base + file.getName());
      entry.setModTime(0);
      entry.setSize(file.length());
      entry.setUserId(0);
      entry.setGroupId(0);
      entry.setUserName("avalon");
      entry.setGroupName("excalibur");
      entry.setMode(0100000);
      entry.setSize(file.length());
      tOut.putArchiveEntry(entry);
  
      if (file.isFile()) {
          IOUtils.copy(new FileInputStream(file), tOut);
          tOut.closeArchiveEntry();
      } else {
          tOut.closeArchiveEntry();
          File[] children = file.listFiles();
          if (children != null) {
              for (File child : children) {
                  addFileToTar(tOut, child, file.getName());
              }
          }
      }
  }
  </code></pre>
  
  <p>Thank you.</p>