0

我有一个简单的 Spring Boot 应用程序,需要将java.security.krb5.conf属性值设置为自定义 krb5.conf 文件。我已将文件添加到 src/main/resources 文件夹中,并且 maven 将其打包到 jar 中。

启动应用程序,我运行 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 (文件名)。所以我尝试做 getClass.getResource (filename).getPath() 以便我可以在主类中启动应用程序时将其设置为 java.security.krb5.conf 系统属性,而不是从命令行传递。但是 getPath 显示的字符串类似于/<diskPath>/my-jar.jar!/BOOT-INF/classes!/krb5.conf,当我尝试读取文件进行测试时,该路径不起作用。
  • 在调用 SprinApplication.run 之前,在 main 方法中即时创建文件副本到正在运行的目录。这就是我现在正在做的事情。
    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");

如果这个问题有解决方案,我可以看到其他用例,例如将 jar 中包含的 trustore 文件提供为 javax.net.ssl.trustStore 等。

4

2 回答 2

0

读取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();
}

编辑:当打包为 SpringBoot fat JAR 时,尝试读取文件,FileInputStream结果为java.io.FileNotFoundException: file:/<path-to-jar/<jar-name>.jar!/BOOT-INF/classes!/krb5.conf (No such file or directory):-(

于 2020-02-17T19:22:07.617 回答
0

给出 -Djava.security.krb5.conf=classpth:krb5.conf(也是 ./krb5.conf)。没用

实际上,它不是“classpth”,而是“classp a th”。并在其后加上斜线。

-Djava.security.krb5.conf=classpath/:krb5.conf应该管用。

于 2020-02-17T19:22:32.517 回答