Задача: В одном каталоге с 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
Это как-то лечится? Вот здесь советуют просто обрезать строку до нужного вида. Но как-то метод мне не очень нравится
Получился такой код
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));
Может библиотека и не знает о спринг, но спринг-то о ней точно знает.
По моему можно создать класс с @Configuration аннотацией, ему же добавить @PropertySource, в которой правильно прописать путь к внешнему файлу. Этот класс через @Value("${какой-то-ключ-из-проперти-файла}") сможет получить значения в поля этого класса, в этом же классе создать методы с @Bean аннотацией, которые создадут объекты вашей библиотеки с использование значений из проперти файла.
Продвижение своими сайтами как стратегия роста и независимости