2016-11-29 5 views
0

сценарий:Программа работает в среде IDE с ресурсами в файле jar, но приложение не может их прочитать - почему?

  • У меня есть каталог/папку в моем приложении дерева, содержащие изображения
    • ancilliaryUI/Graphics/FAS-IconFiles/{*.png}
  • В IDE (NetBeans) мой код получает ресурс как InputStream для /ancilliaryUI/Graphics/FAS-IconFiles
    • getContextClassLoader().getResourceAsStream(resource);
    • если выше возвращает null, я использую getClass().getResourceAsStream(resource)
  • Я экземпляр InputStreamReader с InputStream сверху
  • Я экземпляр BufferedReader с InputStreamReader

Все вышеперечисленное работы в IDE и программный код (возвращаемые действительные объекты)

  • Тогда я петля над BufferedReader с br.readLine()
    • Это делает, как и ожидалось: каждая итерация возвращает имя типа String изображения в /ancilliaryUI/Graphics/FAS-Icon-Files пути
    • я затем использовать его для извлечения ресурса в виде потока и создать IconImage. Все хорошо. Когда я создаю приложение, я просматриваю файл jar и все изображения находятся там по правильному пути.

Если я запустить приложение как:

java -jar appname.jar 

Я получаю NullPointerException от br.readLine(), хотя ни один из моих объектов выше не равны нулю. ПРИМЕЧАНИЕ. br.readLine просто считывает «имя ресурса» каждого изображения и передает строку другому методу, который создает ImageIcon. Название ресурса String никогда не возвращается из-за исключения. И все же все это прекрасно работает, если вы запускаете IDE.

Любая помощь будет оценена по достоинству. Спасибо!

Вот код (с нагрузками отладки в отчаянии):

private List<String> getResources(String path) throws IOException { 
    List<String> filenames = new ArrayList<>(); 
    BufferedReader br = null; 

    Debug.printm("PATH = " + path); 

    try { 
     InputStream in = getResourceAsStream(path); 
     InputStreamReader isReader = new InputStreamReader(in); 
     Debug.printm("isReader = " + isReader.toString()); 
     br = new BufferedReader(isReader); 
    } catch (Exception e) { 
     throw e; 
    } 
    String resource; 
    Debug.printm("Going to readLine(" + path + "): br = " + br.toString()); 
    try { 
     while ((resource = br.readLine()) != null) { 
      Debug.printm("Adding resource: " + resource); 
      filenames.add(resource); 
     } 
    } catch (Exception e) { 
     Debug.printm("readLine(): " + e.getLocalizedMessage()); 
     throw e; 
    } 
    Debug.printm("path = " + path); 
    return filenames; 
} 

private InputStream getResourceAsStream(String resource) { 
    final InputStream in 
      = getContextClassLoader().getResourceAsStream(resource); 

    return in == null ? getClass().getResourceAsStream(resource) : in; 
} 

private ClassLoader getContextClassLoader() { 
    return Thread.currentThread().getContextClassLoader(); 
} 

ответ

0

я нашел решение путем поиска экстенсивно How can I get a resource "Folder" from inside my jar File?. Я решил реализовать свой список ресурсов по-разному в конце и быстрее. Тем не менее, я буду хранить этот фрагмент кода для дальнейшего использования. Спасибо user1079877!

Смежные вопросы