Как ссылаться на файл внутри 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 должно сработать.

Другие вопросы по тегам