2009-10-07 7 views
27

मैंने JAR फ़ाइल बनाई है। अब, मैंने एक और जावा प्रोग्राम बनाया है। मैं उस जेएआर फ़ाइल को किसी अन्य निर्देशिका में अनपैक करना चाहता हूं, जिसका अर्थ है कि मैं कुछ अनजिप करना चाहता हूं।जावा प्रोग्राम कैसे लिखना है जो एक जेएआर फ़ाइल निकालने और निर्दिष्ट डेटा (स्थान) में अपना डेटा स्टोर कर सकता है?

अगर मैं jar -xf filename.jar इस चलाने के कुछ त्रुटि का कारण बनता है:

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)` 

उत्तर

54

इस उदाहरण अनुकूल: How to extract Java resources from JAR and zip archive

या कोशिश इस कोड:

Extract the Contents of ZIP/JAR Files Programmatically

Suppose jarFile is the jar/zip file to be extracted. destDir is the path where it will be extracted:

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(); 

स्रोत: http://www.devx.com/tips/Tip/22124

+2

क्या यह किसी और के लिए काम नहीं करता है? मैं इस वजह से FileNotFoundExceptions फेंक रहा हूं ..... – Flafla2

+0

मेरे लिए समान समस्या @ Flafla2। – MiJyn

+2

@lkjoel यह अपवाद फेंकने का कारण यह है कि आप "dest/folder1" बनाने से पहले अनिवार्य रूप से "dest/folder1/file1" जैसी चीजें लिखने की कोशिश कर रहे हैं। इसे हल करने के लिए, मैं पहले से जारेंट्री गणना के माध्यम से पुनरावृत्ति की अनुशंसा करता हूं, और इसे getName() आकार() (आकार से कम से कम) पर क्रमबद्ध सूची में बदल देता हूं। इस तरह, आप अपने बच्चों की फाइल/उपनिर्देशिकाओं से पहले सभी आवश्यक निर्देशिकाएं तैयार करेंगे। – Destin

1

आपका शीर्षक बहुत अच्छी तरह से सवाल मिलान करने के लिए, लेकिन अगर आप वास्तव में "लिखने के लिए [एक] जावा कार्यक्रम एक जार फ़ाइल को निकालने चाहते हैं नहीं लगता है "आपको बस Class JarFile की आवश्यकता है।

+0

हाँ मैं एक जावा प्रोग्राम है जो एक जार फ़ाइल निकालने होगा लिखना चाहते –

4

JarFile कक्षा।

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

हाँ मैं कुछ इस तरह चाहते हैं, लेकिन मैं कैसे कुछ अन्य निर्देशिका में निकाली गई फ़ाइल स्टोर कर सकते हैं। क्या आप कृपया मुझे मार्गदर्शन कर सकते हैं। –

5

आप अपने कार्य को प्राप्त करने के लिए एक संदर्भ के रूप कोड का उपयोग कर सकते हैं किया गया। यह लगभग @JuanZe द्वारा दिखाए गए कोड स्निपेट जैसा ही है, सिवाय इसके कि गेटी थे FileNotFoundException, मैंने एक छोटा कोड स्निपेट जोड़ा है जो जांच करेगा कि फ़ाइल मौजूद है या नहीं और यदि ऐसा नहीं होता है तो यह फाइलों के साथ मूल फ़ोल्डर बना देगा और निर्दिष्ट गंतव्य फ़ोल्डर के अंदर जार फ़ाइल की सामग्री निकाल देगा।

कोड स्निपेट:

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<java.util.jar.JarEntry> 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(); 
    } 

    } 

} 
+0

यह कोड स्निप किया गया है जो पिछले मामले में FileNotFound अपवाद प्राप्त कर रहे हैं – stacky

2

यहाँ मैं अपने जार से मेरे पूरे "संसाधन" फ़ोल्डर को निकालने के लिए क्या करेंगे है। यह BufferedReader और BufferedWriter का उपयोग करने के लिए और अधिक तेज़ तरीका है।

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<JarEntry> 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; 
} 
+0

Buffered पाठक का उपयोग करके, यह सेकंड में किया जाता है। बडा फर्क। धन्यवाद –

1

आप पैक/खोल जार फ़ाइल

JarManager

बहुत ही सरल

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<File> unpacked_files = jarUnpacker.unpack(myfile.getAbsolutePath(), unpackDir.getAbsolutePath()); 
} 

को यह बहुत ही सरल पुस्तकालय का उपयोग कर सकते तुम भी Maven निर्भरता का उपयोग कर सकते

<dependency> 
    <groupId>fr.stevecohen.jarmanager</groupId> 
    <artifactId>JarManager</artifactId> 
    <version>0.5.0</version> 
</dependency> 

तुम भी मेरी भंडार

<repository> 
    <id>repo-reapersoon</id> 
    <name>ReaperSoon's repo</name> 
    <url>http://repo-maven.stevecohen.fr</url> 
</repository> 

जरूरत के लिंक के साथ पिछले संस्करण की जाँच करें bellow पिछले निर्भरता का उपयोग करने के

कृपया का उपयोग अपने public issue tracker आप कुछ कीड़े पाते हैं

0

खैर यहाँ है मेरी संस्करण, 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); 
    } 
0

पुराना सवाल।
यहाँ एक अद्यतन जवाब का उपयोग कर रहा है: बनाने के लिए

  • जावा 7 java.nio और कॉपी कुशलता से सॉर्ट और कोषगत प्रविष्टियां एकत्र (क्रम में हमेशा पहले फ़ोल्डर बना करने के लिए) के लिए प्रविष्टियां
  • जावा 8 stream

ध्यान दें कि मैंने java.util.jar.JarFile (उप-वर्ग) के बजाय java.util.zip.ZipFile (बेस क्लास) का उपयोग किया था।
अंतिम व्यक्ति अधिक चीजें करता है और इन्हें संग्रह उपयोग केस से निकालने वाली फ़ाइलों के लिए आवश्यक नहीं है।
तो यह ओवरहेड को कम करता है और सुरक्षा चिंताओं से संबंधित अपवाद को रोकता है।

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); 
      } 
     } 

    } 
} 
संबंधित मुद्दे