Wie schreibe ich ein Java-Programm, das eine JAR-Datei entpacken und ihre Daten im angegebenen Verzeichnis (Ort) speichern kann?

Ich habe eine JAR- Datei erstellt. Jetzt habe ich ein anderes Java-Programm erstellt. Ich möchte diese JAR-Datei in einem anderen Verzeichnis entpacken, was bedeutet, dass ich etwas wie entpacken möchte.

Wenn ich jar -xf filename.jar verursacht dies einen Fehler:

 Exception in thread "main" java.io.IOException: Cannot run program "jar": java.io.IOException: error=2, No such file or directory at java.lang.ProcessBuilder.start(ProcessBuilder.java:459) at java.lang.Runtime.exec(Runtime.java:593)` 

   

Passen Sie dieses Beispiel an: So extrahieren Sie Java-Ressourcen aus JAR- und Zip-Archiv

Oder probiere diesen Code aus:

Extrahieren Sie den Inhalt von ZIP / JAR-Dateien programmgesteuert

Angenommen, jarFile ist die jar / zip-Datei, die extrahiert werden soll. destDir ist der Pfad, in dem es extrahiert wird:

 java.util.jar.JarFile jar = new java.util.jar.JarFile(jarFile); java.util.Enumeration enumEntries = jar.entries(); while (enumEntries.hasMoreElements()) { java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement(); java.io.File f = new java.io.File(destDir + java.io.File.separator + file.getName()); if (file.isDirectory()) { // if its a directory, create it f.mkdir(); continue; } java.io.InputStream is = jar.getInputStream(file); // get the input stream java.io.FileOutputStream fos = new java.io.FileOutputStream(f); while (is.available() > 0) { // write contents of 'is' to 'fos' fos.write(is.read()); } fos.close(); is.close(); } jar.close(); 

Quelle : http://www.devx.com/tips/Tip/22124

Sie können dieses Code-Snippet als Referenz verwenden, um Ihre Aufgabe zu erledigen. Es ist fast dasselbe wie das oben gezeigte Code-Snippet von @JuanZe, außer dass für diejenigen, die die FileNotFoundException erhalten haben, ein kleines Code-Snippet hinzugefügt wurde, das prüft, ob Datei existiert und falls nicht, erstellt sie den übergeordneten Ordner zusammen mit den Dateien und extrahiert den Inhalt der JAR-Datei im angegebenen Zielordner.

Code-Auszug:

 public class JarDemo { public static void main(String[] args) throws java.io.IOException { java.util.jar.JarFile jarfile = new java.util.jar.JarFile(new java.io.File("E:/sqljdbc4.jar")); //jar file path(here sqljdbc4.jar) java.util.Enumeration enu= jarfile.entries(); while(enu.hasMoreElements()) { String destdir = "E:/abc/"; //abc is my destination directory java.util.jar.JarEntry je = enu.nextElement(); System.out.println(je.getName()); java.io.File fl = new java.io.File(destdir, je.getName()); if(!fl.exists()) { fl.getParentFile().mkdirs(); fl = new java.io.File(destdir, je.getName()); } if(je.isDirectory()) { continue; } java.io.InputStream is = jarfile.getInputStream(je); java.io.FileOutputStream fo = new java.io.FileOutputStream(fl); while(is.available()>0) { fo.write(is.read()); } fo.close(); is.close(); } } } 

JarFile- class.

 JarFile file = new JarFile("file.jar"); for (Enumeration enum = file.entries(); enum.hasMoreElements();) { JarEntry entry = enum.next(); System.out.println(entry.getName()); } 

Hier ist, was ich tun würde, um meine ganze “Ressourcen” Ordner aus meinem Glas zu extrahieren. Es ist viel schneller, BufferedReader und BufferedWriter zu verwenden.

  public static boolean extractResourcesToTempFolder() { try { //If folder exist, delete it. String destPath = getTempDir() + File.separator + "JToolkit" + File.separator; deleteDirectoryRecursive(new File(destPath)); JarFile jarFile = new JarFile(JToolkit.class.getProtectionDomain().getCodeSource().getLocation().getPath()); Enumeration enums = jarFile.entries(); while (enums.hasMoreElements()) { JarEntry entry = enums.nextElement(); if (entry.getName().startsWith("resources")) { File toWrite = new File(destPath + entry.getName()); if (entry.isDirectory()) { toWrite.mkdirs(); continue; } InputStream in = new BufferedInputStream(jarFile.getInputStream(entry)); OutputStream out = new BufferedOutputStream(new FileOutputStream(toWrite)); byte[] buffer = new byte[2048]; for (;;) { int nBytes = in.read(buffer); if (nBytes < = 0) { break; } out.write(buffer, 0, nBytes); } out.flush(); out.close(); in.close(); } System.out.println(entry.getName()); } } catch (IOException ex) { Logger.getLogger(Methods.class.getName()).log(Level.SEVERE, null, ex); return false; } return true; } 

Ihr Titel scheint nicht sehr gut mit der Frage übereinzustimmen, aber wenn Sie wirklich “ein Java-Programm schreiben wollen, das eine Jar-Datei entpackt “, brauchen Sie nur Class JarFile .

Sie können diese sehr einfache Bibliothek zum Packen / Entpacken von JAR-Dateien verwenden

JarManager

Sehr einfach

 import java.io.File; import java.util.List; import fr.stevecohen.jarmanager.JarUnpacker; class Test { JarUnpacker jarUnpacker = new JarUnpacker(); File myfile = new File("./myfile.jar"); File unpackDir = new File("./mydir"); List unpacked_files = jarUnpacker.unpack(myfile.getAbsolutePath(), unpackDir.getAbsolutePath()); } 

Sie können auch maven-Abhängigkeit verwenden

  fr.stevecohen.jarmanager JarManager 0.5.0  

Sie brauchen auch mein Repository

  repo-reapersoon ReaperSoon's repo http://repo-maven.stevecohen.fr  

Überprüfen Sie die letzte Version mit dem folgenden Link, um die letzte Abhängigkeit zu verwenden

Bitte benutzen Sie meinen öffentlichen Issue Tracker, wenn Sie einige Fehler finden

Alte Frage.
Hier ist eine aktualisierte Antwort mit:

  • Java 7 java.nio zum effizienten Erstellen und Kopieren von Einträgen
  • Java 8 stream , um die Einträge lexikographisch zu sortieren und zu sammeln (um Ordner immer zuerst zu erstellen).

Beachten Sie, dass ich java.util.zip.ZipFile (die Basisklasse) anstelle von java.util.jar.JarFile (die Unterklasse) verwendet habe.
Der letzte führt mehr Dinge durch, die nicht “nur” Dateien aus einem Archiv extrahieren müssen.
Dies reduziert den Overhead und verhindert eine Ausnahmebedingung im Zusammenhang mit Sicherheitsbedenken.

 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class FileUtils { public static void extractArchive(Path archiveFile, Path destPath) throws IOException { Files.createDirectories(destPath); // create dest path folder(s) try (ZipFile archive = new ZipFile(archiveFile.toFile())) { // sort entries by name to always created folders first List< ? extends ZipEntry> entries = archive.stream() .sorted((a, b) -> a.getName() .compareTo(b.getName())) .collect(Collectors.toList()); // copy each entry in the dest path for (ZipEntry entry : entries) { Path entryDest = destPath.resolve(entry.getName()); if (entry.isDirectory()) { Files.createDirectory(entryDest); continue; } Files.copy(archive.getInputStream(entry), entryDest); } } } } 

Nun, hier ist meine Version mit try-with-resources :

  try (JarFile jarFile = new JarFile(artifact.getFile())) { for (JarEntry entry : Collections.list(jarFile.entries())) { try (InputStream is = jarFile.getInputStream(entry)) { File file = new File(targetDir, entry.getName()); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(is.read()); } } } } catch (IOException e) { throw new MyException(String.format( "Unable to open jar %s", artifact.getArtifactId()), e); }