【问题标题】:Jar file not able to find the keystoreJar 文件找不到密钥库
【发布时间】:2020-03-01 21:11:22
【问题描述】:

我正在运行一个 SpringKafka 生产者。我已经在 yml 文件中配置了密钥库位置,并在 eclipse 中运行时获取了它。但是当代码作为 jar 运行时,它无法找到密钥库位置。如何解决这个问题。

spring:
  kafka:
    producer:
      ssl:
        key-password:
        key-store-location: classpath:es-cert.jks
        key-store-password: password
        key-store-type: jks

这是我的 yml 文件。

我收到以下错误:

java.io.FileNotFoundException:类路径资源 [es-cert.jks] 无法解析为绝对文件路径,因为它不驻留在文件系统中:jar:file:/u01/home/app/user-docker /kafka2.jar!/BOOT-INF/classes!/es-cert.jks

但是 es-cert.jks 存在于 jar 中。

【问题讨论】:

  • es-cert.jks文件在jar文件里面吗?
  • 是的,它就在那里。

标签: java spring-boot ssl keystore spring-kafka


【解决方案1】:

Kafka 不理解 Spring 资源,仅文件系统上的文件。

您不能使用classpath: 从 jar 中引用密钥库,因为 Spring Boot 必须将资源转换为绝对路径才能将其传递给 Kafka。

    private String resourceToPath(Resource resource) {
        try {
            return resource.getFile().getAbsolutePath();
        }
        catch (IOException ex) {
            throw new IllegalStateException("Resource '" + resource + "' must be on a file system", ex);
        }

一种解决方案是自己将密钥库从 jar 资源复制到文件系统上的文件中。在加载 SpringApplication 之前执行此操作。

例如使用FileCopyUtils

【讨论】: