Для вашего случая вам нужен один, но последний метод ниже, который принимает InputStream.Последний метод добавлен в качестве примера для вашего случая с файлом в банке в classpath.Вы можете сделать обработку исключений по-другому.
public class XMLLib {
public static DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
public static Document readXML(File file) {
try {
final DocumentBuilder builder = builderFactory.newDocumentBuilder();
return builder.parse(file);
} catch (ParserConfigurationException ex) {
return null;
} catch (SAXException | IOException ex) {
return null;
}
}
public static Document readXML(InputStream is) {
try {
final DocumentBuilder builder = builderFactory.newDocumentBuilder();
return builder.parse(is);
} catch (ParserConfigurationException ex) {
return null;
} catch (SAXException | IOException ex) {
return null;
}
}
//example call:
public static Document getDocumentResource(String resourcepath){
try (InputStream is = XMLLib.class.getResourceAsStream(resourcepath)){
return readXML(is);
} catch (IOException ex) {}
return null;
}
}
Еще несколько объяснений: в среде Eclipse извлекается xml-файл, так что вы можете получить к нему доступ непосредственно в виде файла (так как это «файл»).Теперь, когда все в банке, XML больше не существует как «Файл», поэтому вы должны извлечь его из файла.Загрузчик классов может сделать это через getResourceAsStream - так же, как он может читать другие ресурсы и классы.Таким образом, по сути, это загрузка XML, как Java загружает класс.Чтобы это работало, путь к ресурсу должен быть задан относительно пути к классу.Будет работать только указанная выше версия InputStream (или какой-либо другой подход, например, с использованием Path и файловой системы)
Обычно, если у вас есть ресурс в "resources / userConfig.xml", путь простой "/userConfig.xml".(но это зависит от того, как проект собран)
Я могу только догадываться (зависит от того, как проект собран), в вашем случае вам нужно:
Document document = XMLLib.getDocumentResource("/userConfig.xml");
Важно: Версия InputStreamработает с файлом в jar и с извлеченным файлом (это всегда ) - до тех пор, пока он не найден загрузчиком классов.