// ensure parent directories have been created
File parent = destinationFile.getParentFile();
if (parent != null && !parent.exists()) parent.mkdirs();
FileOutputStream fos = null;
JarOutputStream out = null;
try {
byte[] buffer = new byte[4096];
fos = new FileOutputStream(destinationFile, false);
if (manifest != null) {
out = new JarOutputStream(fos, manifest);
// add the startup file which allows us to locate the startup directory
out.putNextEntry(new ZipEntry(META_INF_STARTUP_JAR));
// intentionally empty ZipEntry
out.closeEntry();
} else {
out = new JarOutputStream(fos);
}
// write the configurationData
ExecutableConfigurationUtil.writeConfiguration(configurationData, out);
URI baseURI = configurationDir.getAbsoluteFile().toURI();
Collection files = listRecursiveFiles(configurationDir);
for (Iterator iterator = files.iterator(); iterator.hasNext();) {
File file = (File) iterator.next();
String relativePath = baseURI.relativize(file.toURI()).getPath();
if (!EXCLUDED.contains(relativePath)) {
InputStream in = new FileInputStream(file);
try {
out.putNextEntry(new ZipEntry(relativePath));
try {
int count;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
} finally {
out.closeEntry();
}
} finally {
close(in);
}
}