2015-08-22 3 views
0

Я столкнулся с этой странной проблемой при создании моего проекта через Maven.class.getClassLoader getResourceasStream возвращает null в jar

enter image description here

Вот мой код для чтения текстового файла, который я положил под resources папку в проекте Maven. Во время работы с IDE все в порядке, но как только я создаю банку и запускаю из командной строки, она возвращает мне null.

public static void main(String[] args) throws IOException { 
    URL jarUrl = FreeCalcTest.class.getProtectionDomain().getCodeSource().getLocation(); 
    System.out.println("JarUrl : "+jarUrl); 
    String filePath = "UserDetails\\ReadFile.txt"; 
    URL url = FreeCalcTest.class.getClassLoader().getResource(filePath); 
    System.out.println(url); 
    InputStream inputStream = FreeCalcTest.class.getClassLoader().getResourceAsStream(filePath); 
    UserDetailReader userDetailReader = new UserDetailReader(inputStream); 
    List<UserDetailValueSet> userDetails = userDetailReader.read(); 
    Set<String> attrList = UserDetailAttributes.getAttributes(); 
    Iterator<String> attrItr = attrList.iterator(); 
    Iterator<UserDetailValueSet> itr = userDetails.iterator(); 
    while (itr.hasNext()) { 
     UserDetailValueSet userDetailValueSet = (UserDetailValueSet) itr.next(); 
     while (attrItr.hasNext()) { 
      String attr = (String) attrItr.next(); 
      System.out.println(userDetailValueSet.getValueSet().get(attr)); 
     } 

    } 
} 

Исключение StackTrace:

JarUrl : file:/C:/Users/bnath/Desktop/FreeCalc-0.0.1-SNAPSHOT.jar null 
Exception in thread "main" java.lang.NullPointerException 
    at java.io.Reader.<init>(Unknown Source) at java.io.InputStreamReader.<init>(Unknown Source) 
    at com.sec.io.reader.UserDetailReader.read(UserDetailReader.java:24) 
    at com.sec.testFreeCalc.FreeCalcTest.main(FreeCalcTest.java:24) 
+0

Можете ли вы опубликовать трассировки стека, чтобы мы могли вникать в проблему –

+0

Как вы строите свой файл jar? Попробуйте открыть файл jar, например. используя WinZip. Я предполагаю, что 'UserDetails \ ReadFile.txt' здесь * not *. – Andreas

+0

Я проверил UserDetails \ ReadFile.txt в файле Jar. Ниже трассировки стека JarUrl: Файл:/C: /Users/bnath/Desktop/FreeCalc-0.0.1-SNAPSHOT.jar нулевого Исключения в потоке "главные" java.lang.NullPointerException в java.io.Reader , (Неизвестный источник) at java.io.InputStreamReader. (Unknown Source) на com.sec.io.reader.UserDetailReader.read (UserDetailReader.java:24) в com.sec.testFreeCalc.FreeCalcTest.main (FreeCalcTest.java:24) –

ответ

0

Вы should use прямой слэш в качестве разделителя путей ресурсов, поэтому стараются "UserDetails/ReadFile.txt"

загрузчик классов отвечает интерпретировать путь и найти ресурс. При поиске ресурса в файловой системе путь с обратным слэшем работает в Windows, вероятно, потому, что он просто интерпретируется как относительный путь.

Такой путь не работает, когда запрашиваются ресурсы внутри JAR-файла, так как формат для записей JAR требует косой черты в качестве разделителя.

+0

Спасибо, что сейчас работает. Когда я даю обратную косую черту, среда IDE преобразует ее в специальный символ, поэтому в среде IDE он работает отлично в Jar, возвращая его null. С обратным следом путь идет как : файл:/D: /workspace/FreeCalc/target/classes/UserDetails%5cReadFile.txt дополнительный% 5c добавляется перед именем файла. С форвардами сокращает рабочий режим. Не могли бы вы рассказать мне, почему это происходит. –

+0

@BhupendraNath отлично, что он работает. Для более глубокого понимания внутренней работы загрузчиков классов вы можете более внимательно изучить стандартную реализацию загрузчика классов, которая представляет собой http://developer.classpath.org/doc/java/net/URLClassLoader-source.html. И, пожалуйста, не забудьте отметить ответ, как принято, спасибо! – wero

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