【问题标题】:java.io.FileNotFoundException: /home/ec2-user/src/main/resources/keystore.jks (No such file or directory)java.io.FileNotFoundException: /home/ec2-user/src/main/resources/keystore.jks (没有这样的文件或目录)
【发布时间】:2018-04-25 11:09:16
【问题描述】:

我在引用 jar 文件中的文件时遇到问题,特别是 keystore.jks。我将文件存储在资源文件中,但是当我尝试运行 springboot 项目时,文件似乎没有被拾取。

我得到这个错误:

java.io.FileNotFoundException: /home/ec2-user/src/main/resources/keystore.jks (No such file or directory)

这是我的 applications.properties 文件:

server.ssl.key-store=src/main/resources/keystore.jks
server.ssl.key-store-password=mypassword
server.ssl.keyStoreType=JKS
server.ssl.keyAlias=my_alias

这是我的项目结构:

【问题讨论】:

  • 请出示java代码。

标签: java spring-boot resources


【解决方案1】:

尝试使用:

server.ssl.key-store=classpath:keystore.jks

文档:docs.spring.io

【讨论】:

    【解决方案2】:

    从资源文件中读取:

    applications.properties

    server.ssl.key-store=keystore.jks
    

    java

    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource(prop.getProperty("server.ssl.key-store")).getFile());
    

    【讨论】:

    • 在我的 Spring Boot 项目中,我应该在哪里添加这个登录?
    【解决方案3】:

    您的应用程序似乎从/home/ec2-user/ 开始。 你应该设置server.ssl.key-storepath 相对于/home/ec2-user/

    【讨论】:

    • OP 将 JKS 嵌入到 jar 中,文件路径的相对性无关紧要,因为实际的 JKS 文件不是 on 作为独立文件的文件系统
    • keystore.jks 文件在 jar 文件中,我不确定按照您的方法是否可行
    【解决方案4】:

    我也遇到了同样的问题。我的解决方案是

    我的 applications.properties 文件:

    jvm:
        key-store-type: PKCS12
        key-store: banking.p12
        key-store-password: aWRldmh1YlU=
    

    This is my project structure

    还有我的密钥库加载器

    public InputStream getKeyStoreStream(String resourceName) {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        return loader.getResourceAsStream(resourceName);
    }
    

    加载

        @Value("${jvm.trust-store}")
        private String JVM_TRUST_STORE;
    
        @Value("${jvm.key-store}")
        private String JVM_KEY_STORE;
    
    keysP12 = KeyStore.getInstance("PKCS12");
    keysP12.load(getKeyStoreStream(JVM_KEY_STORE), keyStorePassword);
    

    我认为 JKS 也是这样

    keysJks = KeyStore.getInstance("JKS");
    keysJks.load(getKeyStoreStream(JVM_TRUST_STORE), trustStorePassword);
    

    【讨论】:

    • 所以你创建了一个单独的类来处理 keystore.jks 文件?
    • 我只创建了用于加载 keystore.jks 的方法 getKeyStoreStream。此方法是 TLS 连接类的一部分。参数 resourceName 它是文件名,例如 keystore.jks。我从属性文件中得到他们的名字
    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2019-12-25
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多