Как ссылаться на файл внутри jar весенней загрузки приложения как значение свойства -D при запуске приложения из командной строки? - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть простое приложение с весенней загрузкой, которому нужно java .security.krb5.conf значение свойства, установленное в пользовательский файл krb5.conf. Я добавил файл в папку src / main / resources и сделал maven упакованным в банку.

чтобы запустить приложение, я запускаю java -jar -Djava.security.krb5.conf=<localPath>/krb5.conf my-jar.jar

, в настоящее время я должен указать <localPath> в качестве пути к файлу на моей машине. Есть ли способ обратиться к файлу внутри jar, чтобы я мог работать на любом компьютере, не создавая файл файла сначала на компьютере?

вещи, которые я до сих пор пробовал:

  • дай -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 et c.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

дают -D java .security.krb5.conf = classpth: krb5.conf (также ./krb5.conf). Не сработало

Это не «classpth», это «classp a th», на самом деле. И с sla sh после него.

-Djava.security.krb5.conf=classpath/:krb5.conf должно работать.

0 голосов
/ 17 февраля 2020

Код, который читает файл конфигурации 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): - (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...