Как исправить FileNotFoundException для файлового ресурса java jar?

#java #jar

#java #jar

Вопрос:

Мне нужно прочитать zip-файл из моего jar, чтобы я мог передать его конструктору OpenOfficeSpellDictionary. Поскольку файл dictionary .zip находится внутри файла jar, я не могу создать новую ссылку на файл с URI, как я могу, когда файл находится за пределами jar. Кажется, правильный способ загрузить ресурс внутри jar — это как InputStream, но мне нужно передать файл в конструктор OpenOfficeSpellDictionary.
Код теперь выглядит следующим образом:

 public static SpellDictionary forLanguage( MyLanguage lang ){
       String dictName = (String) props.get(lang.getLocale().getLanguage());
       if ( dictName != null ){
           if ( dicts.containsKey(lang) )
               return dicts.get(lang);
           System.out.println("loading dictionary for : "   lang);
           URL url = Dictionaries.class.getClassLoader().getResource(dictName);
           System.out.println(url);  //prints null
           try {
               System.out.println("loading dictionary for dictname : "   dictName);
               File zip = new File(url.toURI());
               OpenOfficeSpellDictionary dict = new OpenOfficeSpellDictionary(
                       new ZipFile(zip)
                       );
               dicts.put( lang, dict );

               return dict;
           } catch (Exception e){
               e.printStackTrace();
               dicts.put( lang, null );
           }
       }else{
           System.out.println("dictname is null " );            
       }
       return null;
   }
  

и он выводит :

 loading dictionary for : English
null
loading dictionary for dictname : dict/en_US.zip
java.lang.NullPointerException
    at org.jl.nwn.spell.Dictionaries.forLanguage(Dictionaries.java:58)
  

или иногда, когда я использую немного другой URI:

 java.io.FileNotFoundException: jar:file:/Users/myname/Dev/MyProject/myjar.jar!/resource/dict/en_US.zip (No such file or directory)
  

Я попробовал для dictName строки /dict/en_US.zip , dict/en_US.zip , resource/dict/en_US.zip и /resource/dict/en_US.zip безрезультатно.
Вызов

 InputStream is = Dictionaries.class.getClassLoader().getResourceAsStream(
                    "resource/dict/dictionaries.properties"); 
  

работает, когда я пытаюсь загрузить реквизиты.

Могу ли я превратить InputStream в ссылку на файл внутри файла jar без создания где-либо временного файла? Было бы создание временного файла где-нибудь ужасно хакерским, если бы я мог?

Комментарии:

1. Вопрос в том, почему архивирование в любом случае в файле jar? Простая папка внутри jar была бы лучшим подходом и служила бы для упорядочивания файлов данных / ресурсов по какому-либо вопросу. Какова цель вашего подхода?

2. Ресурсы не являются файлами. Переосмыслите.

3. Изначально в проекте (и это очень старый проект, не моего собственного создания) zip-файлы находились вне файла jar — я просто пытаюсь поместить их внутрь jar, чтобы конечному пользователю не нужно было загружать zip-файлы отдельно. Я не контролирую OpenOfficeSpellDictionary api, и ему необходимо использовать zip-файлы в качестве zip-файлов. Если это невозможно сделать с помощью довольно простого изменения кода, я верну код, поскольку это не является жизненно важной функцией.