code: public static void zip(final File aFileSystemDir, final File aOutputZipFile, final FilenameFilter aIncludesFilter,
              final File... aIncludesFileList) throws FileNotFoundException, IOException {
          final ZipOutputStream zipFileStream = new ZipOutputStream(new FileOutputStream(aOutputZipFile));
          final String parentDirPath = aFileSystemDir.getParentFile().getAbsolutePath();
  
          dirToZip(aFileSystemDir, parentDirPath, aIncludesFilter, zipFileStream);
  
          // Supplied additional files are just written into the root folder of the package
          for (final File file : aIncludesFileList) {
              final String path = File.separator + aFileSystemDir.getName() + File.separator + file.getName();
              final ZipEntry entry = new ZipEntry(path);
              final FileInputStream inFileStream = new FileInputStream(file);
  
              zipFileStream.putNextEntry(entry);
              IOUtils.copyStream(inFileStream, zipFileStream);
              IOUtils.closeQuietly(inFileStream);
          }
  
          IOUtils.closeQuietly(zipFileStream);
      }
docs: Recursively zip up a file system directory.
  
  @param aFileSystemDir A directory to be recursively zipped up
  @param aOutputZipFile An output Zip file
  @param aIncludesFilter A file name filter indicating which files to include
  @param aIncludesFileList A varargs of additional files to include in the zipped directory
  @throws FileNotFoundException If a file expected to be there is not found
  @throws IOException If there is trouble writing to the Zip file