2013-11-08 5 views
2

У меня есть два файла jar. Обычно, если я хочу, чтобы «распаковать» ресурс из моего файла банку я иду:Распаковка/извлечение ресурсов из другого JAR-файла

InputStream in = MyClass.class.getClassLoader().getResourceAsStream(name); 
    byte[] buffer = new byte[1024]; 
    int read = -1; 
    File temp2 = new File(new File(System.getProperty("user.dir")), name); 
    FileOutputStream fos2 = new FileOutputStream(temp2); 

    while((read = in.read(buffer)) != -1) { 
     fos2.write(buffer, 0, read); 
    } 
    fos2.close(); 
    in.close(); 

Что делать, если у меня будет еще один JAR-файлы в том же каталоге? Могу ли я получить доступ ко второму файлу ресурсов JAR с помощью simillar? Этот второй JAR не запускается, поэтому у него нет собственного загрузчика классов. Это единственный способ распаковать этот второй JAR-файл?

ответ

1

Если другой Jar находится в вашем обычном пути, то вы можете просто получить доступ к ресурсу в этой банке точно так же. Если Jar - это просто файл, который не находится в вашем пути к классу, вам нужно будет открыть его и извлечь файл с помощью the JarFile and related classes. Обратите внимание, что файлы Jar являются только специальными типами файлов Zip, поэтому вы также можете получить доступ к файлу Jar с помощью ZipFile related classes

2

Я использовал приведенный ниже код для выполнения той же операции. Для этого используется класс JarFile.

 /** 
    * Copies a directory from a jar file to an external directory. 
    */ 
    public static void copyResourcesToDirectory(JarFile fromJar, String jarDir, String destDir) 
     throws IOException { 
    for (Enumeration<JarEntry> entries = fromJar.entries(); entries.hasMoreElements();) { 
     JarEntry entry = entries.nextElement(); 
     if (entry.getName().startsWith(jarDir + "/") && !entry.isDirectory()) { 
     File dest = new File(destDir + "/" + entry.getName().substring(jarDir.length() + 1)); 
     File parent = dest.getParentFile(); 
     if (parent != null) { 
      parent.mkdirs(); 
     } 

     FileOutputStream out = new FileOutputStream(dest); 
     InputStream in = fromJar.getInputStream(entry); 

     try { 
      byte[] buffer = new byte[8 * 1024]; 

      int s = 0; 
      while ((s = in.read(buffer)) > 0) { 
      out.write(buffer, 0, s); 
      } 
     } catch (IOException e) { 
      throw new IOException("Could not copy asset from jar file", e); 
     } finally { 
      try { 
      in.close(); 
      } catch (IOException ignored) {} 
      try { 
      out.close(); 
      } catch (IOException ignored) {} 
     } 
     } 
    } 
1

Вы можете использовать URLClassLoader.

URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("path_to_file//myjar.jar")}) 
classLoader.loadClass("MyClass");//is requared 
InputStream stream = classLoader.getResourceAsStream("myresource.properties"); 
Смежные вопросы