Creating JAR files programmatically using java.util.jar.JarOutputStream can seem straightforward, but certain nuances can lead to unexpected issues. This article explores these undocumented quirks and provides a comprehensive solution for creating valid JAR files.
When using JarOutputStream, it's crucial to adhere to the following undocumented rules:
Here's a detailed example of how to create a JAR file with a manifest file, addressing the aforementioned quirks:
public void run() throws IOException {
// Prepare the manifest file
Manifest manifest = new Manifest();
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
// Create a new JAROutputStream with the manifest
JarOutputStream target = new JarOutputStream(new FileOutputStream("output.jar"), manifest);
// Iterate over the source directory and add files to the JAR
add(new File("inputDirectory"), target);
// Close the JAROutputStream
target.close();
}
private void add(File source, JarOutputStream target) throws IOException {
// Prepare the entry path
String name = source.getPath().replace("\\", "/");
// Handle directories
if (source.isDirectory()) {
if (!name.endsWith("/")) {
name = "/";
}
// Create a directory entry with appropriate timestamps
JarEntry entry = new JarEntry(name);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
target.closeEntry();
// Recursively add files within the directory
for (File nestedFile : source.listFiles()) {
add(nestedFile, target);
}
}
// Handle files
else {
// Create a file entry with appropriate timestamps
JarEntry entry = new JarEntry(name);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
// Read and write the file contents to the JAR
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(source))) {
byte[] buffer = new byte[1024];
while (true) {
int count = in.read(buffer);
if (count == -1)
break;
target.write(buffer, 0, count);
}
target.closeEntry();
}
}
}
By following these guidelines, you can now confidently create valid JAR files programmatically, ensuring that libraries and other resources included within them are accessible as intended.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3