2012-06-26 4 views
1

im пытается извлечь некоторые файлы из jar-файла, загруженного с помощью java-webstart. ниже код был использован, чтобы найти банку и начать FileSystemИзвлечь некоторый контент из jar-файла, загруженного с помощью JWS

1 final ProtectionDomain domain = this.getClass().getProtectionDomain(); 
2 final CodeSource source = domain.getCodeSource(); 
3 final URL url = source.getLocation(); 
4 final URI uri = url.toURI(); 
5 Path jarPath = Paths.get(uri); 
6 
7 FileSystem fs = FileSystems.newFileSystem(jarPath, null); 

Это прекрасно работает, когда банку-файл находится на локальном диске, но не может в строке 5 в сценарии JWS, потому что

журналы говорит: URL = HTTP: // локальный: 8080/myjarfile.jar

java.nio.file.FileSystemNotFoundException: Provider "http" not installed 
at java.nio.file.Paths.get(Unknown Source) 

Если я понимаю правильно JWS, myjarfile.jar был загружен уже некоторое кэш, поэтому реализация FileSystemProvider для HTTP, чтобы получить некоторое содержание from myjarfile.jar кажется медленным и compl icated. Итак, какие-нибудь хорошие идеи о том, как действовать?

ответ

1

Бревна говорит: URL = HTTP: // локальный: 8080/myjarfile.jar

Это решение безопасности, сделанное Sun перед Oracle приобрела их. Они решили, что это не дело апплетов или приложений JWS. знать местоположение ресурсов в локальной файловой системе, поэтому возвращенный URI теперь всегда будет ссылаться на сервер, даже если они кэшированы локально & приложение. имеет all-permissions уровень безопасности.

Значит, любые хорошие идеи о том, как действовать?

Редизайн приложения. Это единственное практическое решение.

Существует множество способов перебора Zip или Jar для контента, но самый простой способ - включить список содержимого в известное местоположение Jar, найти его с помощью getResource(), прочитать его, затем извлечь каждый ресурс.

+1

спасибо за ответ. Im соблазн вставить .jar/zip с некоторым содержимым в myjarfile.jar. Затем извлеките его в известное место на диске, используя ваше предложение. Затем сохраните текущее решение для извлечения файлов. –

+0

Прохладный. Надеюсь, все будет хорошо. :) –

1

Ниже реализация вашей идеи Эндрю, он использует пакет DirUtil я нашел здесь: http://codingjunkie.net/java-7-copy-move/

public class Zipper { 

    private static final String TEMP_FILE_PREFIX = "temp-"; 
    private static final String TEMP_FILE_SUFIX = ".jar"; 

    private Logger logger = Logger.getLogger(getClass().getName()); 

    public Path extractProgram(String locationOfEmbeddedJar, String installDir) { 
     Path installPath = null; 
     try { 
      installPath = Paths.get(installDir); 
      if (Files.isDirectory(installPath)) { 
       logger.warn("program already installed"); 
      } else { 
       installPath = Files.createDirectory(installPath); 
       Path tempJar = Files.createTempFile(TEMP_FILE_PREFIX, 
         TEMP_FILE_SUFIX); 
       this.extractEmbeddedJar(locationOfEmbeddedJar, tempJar.toFile()); 

       logger.warn("in jarfile"); 
       // in jar file 
       FileSystem fs = FileSystems.newFileSystem(tempJar, null); 
       Path programPath = fs.getPath("/"); 

       logger.warn("programPath=" + programPath + " fileSystem=" 
         + programPath.getFileSystem()); 

       DirUtils.copy(programPath, installPath); 
      } 
     } catch (IOException e) { 
      logger.warn(e); 
     } 

     return (installPath); 

    } 

    private void extractEmbeddedJar(String locationOfEmbeddedJar, 
      File locationOfTargetJar) { 
     logger.warn("extractEmbeddedJar() " + locationOfEmbeddedJar); 
     ClassLoader loader = this.getClass().getClassLoader(); 

     InputStream inputStream = loader 
       .getResourceAsStream(locationOfEmbeddedJar); 
     try { 
      OutputStream out = new FileOutputStream(locationOfTargetJar); 
      byte buf[] = new byte[1024]; 
      int len; 
      while ((len = inputStream.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
      out.close(); 
      inputStream.close(); 

     } catch (IOException e) { 
      logger.warn(e); 
     } 
    } 
} 
+0

Отличный материал! :) +1 для публикации решения. Я отмечаю, что вы удалили «галочку», а затем повторно применили ее к моему ответу. Все в порядке со мной, если вы отметите свой собственный ответ в качестве принятого ответа. :) –