Bagaimana cara membuat file JAR pemrograman menggunakan java.util.jar.JarOutputStream? JAR file yang dihasilkan oleh program saya terlihat benar (itu ekstrak baik-baik saja) tapi ketika saya mencoba memuat perpustakaan dari Java mengeluh bahwa ia tidak dapat menemukan file yang jelas yang tersimpan di dalamnya. Jika saya ekstrak file JAR dan menggunakan Sun's
jar` command-line tool untuk re-kompres yang dihasilkan perpustakaan bekerja dengan baik. Singkatnya, ada sesuatu yang salah dengan saya file JAR.
Tolong jelaskan cara membuat file JAR pemrograman, lengkap dengan manifest file.
Ternyata JarOutputStream
memiliki tiga berdokumen kebiasaan:
Berikut ini adalah cara yang benar untuk membuat file Jar:
public void run() throws IOException
{
Manifest manifest = new Manifest();
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
JarOutputStream target = new JarOutputStream(new FileOutputStream("output.jar"), manifest);
add(new File("inputDirectory"), target);
target.close();
}
private void add(File source, JarOutputStream target) throws IOException
{
BufferedInputStream in = null;
try
{
if (source.isDirectory())
{
String name = source.getPath().replace("\\", "/");
if (!name.isEmpty())
{
if (!name.endsWith("/"))
name += "/";
JarEntry entry = new JarEntry(name);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
target.closeEntry();
}
for (File nestedFile: source.listFiles())
add(nestedFile, target);
return;
}
JarEntry entry = new JarEntry(source.getPath().replace("\\", "/"));
entry.setTime(source.lastModified());
target.putNextEntry(entry);
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();
}
finally
{
if (in != null)
in.close();
}
}
Ada's "permainan kata-kata" memperhatikan: Semua JarEntry's nama TIDAK harus dimulai dengan "/".
Misalnya: jar entri nama untuk file manifest adalah "META-INF/MANIFEST.MF" dan "/META-INF/MANIFEST.MF".
Aturan yang sama harus diikuti untuk semua jar entri.
Anda dapat melakukannya dengan kode ini:
public void write(File[] files, String comment) throws IOException {
FileOutputStream fos = new FileOutputStream(PATH + FILE);
JarOutputStream jos = new JarOutputStream(fos, manifest);
BufferedOutputStream bos = new BufferedOutputStream(jos);
jos.setComment(comment);
for (File f : files) {
print("Writing file: " + f.toString());
BufferedReader br = new BufferedReader(new FileReader(f));
jos.putNextEntry(new JarEntry(f.getName()));
int c;
while ((c = br.read()) != -1) {
bos.write(c);
}
br.close();
bos.flush();
}
bos.close();
// JarOutputStream jor = new JarOutputStream(new FileOutputStream(PATH + FILE), manifest);
}
PATH
variabel: path ke file JAR
FILE
variabel: nama dan format