Comment utiliser JarOutputStream pour créer un fichier JAR?

Comment créer un fichier JAR par programmation en utilisant java.util.jar.JarOutputStream ? Le fichier JAR produit par mon programme semble correct (il extrait bien) mais lorsque j’essaie de charger une bibliothèque, Java se plaint de ne pas trouver de fichiers clairement stockés à l’intérieur. Si j’extrais le fichier JAR et que j’utilise l’outil de ligne de commande jar de Sun pour le compresser à nouveau, la bibliothèque résultante fonctionne correctement. Bref, quelque chose ne va pas avec mon fichier JAR.

Veuillez expliquer comment créer un fichier JAR par programmation, avec un fichier manifeste.

Il s’avère que JarOutputStream a trois JarOutputStream non documentés:

  1. Les noms de répertoire doivent se terminer par une barre oblique ‘/’.
  2. Les chemins doivent utiliser des barres obliques / pas de \
  3. Les entrées ne peuvent pas commencer par une barre oblique ‘/’.

Voici la manière correcte de créer un fichier Jar:

 public void run() throws IOException { Manifest manifest = new Manifest(); manifest.getMainAtsortingbutes().put(Atsortingbutes.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()) { Ssortingng 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(); } } 

Il y a une autre “bizarrerie” à faire attention: tous les noms de JarEntry ne doivent PAS commencer par “/”.

Par exemple: Le nom de l’entrée JAR du fichier manifeste est “META-INF / MANIFEST.MF” et non “/META-INF/MANIFEST.MF”.

La même règle doit être suivie pour toutes les entrées jar.

Voici un exemple de code pour créer un fichier JAR à l’aide de JarOutputStream:

Vous pouvez le faire avec ce code:

 public void write(File[] files, Ssortingng 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.toSsortingng()); 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); } 

Variable PATH : chemin du fichier JAR

Variable FILE : nom et format