Чтение файла возле JAR при работе со spring-boot

179
17 января 2020, 10:20

Задача: В одном каталоге с jar-файлом лежит properties файл, который нужно прочитать.

Вот здесь мне посоветовали такой код

URI uri = clazz.getProtectionDomain().getCodeSource().getLocation().toURI();
String path = new File(uri).getParent();

Все отлично работало, пока я не связался со spring-boot.

В случае обычного jar uri возвращается в виде file:/path/name-of-jar.jar и все работает. Но при использовании spring-boot адрес получается другой jar:file:/path/name-of-jar.jar!/BOOT-INF/classes!/ и последующий вызов

new File(uri)

валится с ошибкой

java.lang.IllegalArgumentException: URI is not hierarchical

Это как-то лечится? Вот здесь советуют просто обрезать строку до нужного вида. Но как-то метод мне не очень нравится

Answer 1

Получился такой код

public static String getParentRealPath(URI uri) throws URISyntaxException {
    if (!"jar".equals(uri.getScheme()))
        return new File(uri).getParent();
    do {
        uri = new URI(uri.getSchemeSpecificPart());
    } while ("jar".equals(uri.getScheme()));
    File file = new File(uri);
    do {
        while (!file.getName().endsWith(".jar!"))
            file = file.getParentFile();
        String path = file.toURI().toString();
        uri = new URI(path.substring(0, path.length() - 1));
        file = new File(uri);
    } while (!file.exists());
    return file.getParent();
}
URI uri = clazz.getProtectionDomain().getCodeSource().getLocation().toURI();
System.out.println(getParentRealPath(uri));
Answer 2

Может библиотека и не знает о спринг, но спринг-то о ней точно знает.

По моему можно создать класс с @Configuration аннотацией, ему же добавить @PropertySource, в которой правильно прописать путь к внешнему файлу. Этот класс через @Value("${какой-то-ключ-из-проперти-файла}") сможет получить значения в поля этого класса, в этом же классе создать методы с @Bean аннотацией, которые создадут объекты вашей библиотеки с использование значений из проперти файла.

READ ALSO
Проблема с библиотекой MPAndroidChart v3.1.0

Проблема с библиотекой MPAndroidChart v3.1.0

Имеется класс ScoreCardActivity где описана работа с библиотекой MPAndroidChart а именно работа с PieChart (круглая диаграмма) Студия подсвечивает красным такие...

235
Не получается вызвать onActivityResult во фрагменте

Не получается вызвать onActivityResult во фрагменте

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

200
Javafx - открыть новую вкладку в одном окне

Javafx - открыть новую вкладку в одном окне

Не могу понять, как при нажатии на кнопку открыть как бы новый Pane с другими кнопками, не окно а именно Pane в том же окне, как, например, в антивирусе...

252
Перечисления и конструктор

Перечисления и конструктор

В enum Apple определен конструтор и не пойму почему мы пишем сразу перечислениям данные в конструктор именно в ENUM, а не в другом месте при создании...

172