Как ссылаться на файл внутри jar приложения загрузки Spring как значение свойства -D при запуске приложения из командной строки?
У меня есть простое приложение для весенней загрузки, которому необходимо установить значение свойства java.security.krb5.conf в специальный файл krb5.conf. Я добавил файл в папку src/main/resources, и maven упаковал его в банку.
чтобы запустить приложение, я бегу
java -jar -Djava.security.krb5.conf=<localPath>/krb5.conf my-jar.jar
в настоящее время я должен дать <localPath>
как путь к файлу на моей машине. Есть ли способ сослаться на файл внутри банки, чтобы я мог работать на любой машине, не создавая файл файла сначала на машине?
вещи, которые я пробовал до сих пор:
- дать
-Djava.security.krb5.conf=classpath:krb5.conf
(также./krb5.conf). Не сработало - Я вижу, что большинство примеров "как читать файлы по пути к классам" относятся к getClass.getResource (filename). Итак, я попытался сделать getClass.getResource (filename).getPath(), чтобы я мог установить его как системное свойство java.security.krb5.conf при запуске приложения в основном классе вместо перехода из командной строки. Но строка, которую показывает getPath, выглядит примерно так:
/<diskPath>/my-jar.jar!/BOOT-INF/classes!/krb5.conf
и этот путь не работает, когда я пытаюсь прочитать файл для тестирования. - Создайте копию файла в рабочем каталоге на лету в основном методе перед вызовом SprinApplication.run. Вот чем я сейчас занимаюсь.
try(
InputStream in = new ClassPathResource("krb5.conf").getInputStream();
OutputStream out = new FileOutputStream( new File("krb5copy.conf"));) {
IOUtils.copy(in, out);
}
System.setProperty("java.security.krb5.conf","krb5copy.conf");
Если есть решение для этого вопроса, я могу увидеть другие варианты использования, такие как предоставление файла trustore, включенного в jar, как javax.net.ssl.trustStore и т. Д.
2 ответа
Код, читающий krb5.conf
файл конфигурации использует FileInputStream
, который требует путь к файлу и не "понимает" classpath:
префикс.
Идея ниже заключается в том, чтобы найти файл в пути к классам и получить путь к файлу:
ClassPathResource resource = new ClassPathResource("krb5.conf");
try
{
String fileSpec = resource.getURL().getFile();
System.setProperty("java.security.krb5.conf", fileSpec);
}
catch (IOException e)
{
// TODO handle the exception
e.printStackTrace();
}
РЕДАКТИРОВАТЬ: при упаковке в виде толстого JAR SpringBoot пытается прочитать файл с помощью FileInputStream
приводит к java.io.FileNotFoundException: file:/<path-to-jar/<jar-name>.jar!/BOOT-INF/classes!/krb5.conf (No such file or directory)
:-(
дать -Djava.security.krb5.conf=classpth:krb5.conf (также./krb5.conf). Не сработало
Это не "classpth" это "classp й", на самом деле. И с косой чертой после него.
-Djava.security.krb5.conf=classpath/:krb5.conf
должно сработать.