java - "mvn spring-boot:run"与 "java jar target/xxx.jar"

标签 java spring maven spring-boot resourcebundle

我的 Spring Boot Rest 应用程序中的 src/main/resources 下有两个 jks 文件

  1. Test1.jks 通过 https 进行出站调用另一个 Rest api。
  2. Test2.jks 在此 REST API 中启用 https。

我正在使用 Spring Boot 入口点中的相对值设置资源文件 test1.jks 的路径,该入口点工作正常。这些jks文件用于调用https服务。

public class TestApp {

    static
    {
        System.setProperty("javax.net.ssl.trustStore", "TestApp.class.getClassLoader().getResource("test1.jks").getFile()");
        System.setProperty("javax.net.ssl.trustStorePassword", password);
        System.setProperty("javax.net.ssl.keyStore",  "TestApp.class.getClassLoader().getResource("test1.jks").getFile()");
        System.setProperty("javax.net.ssl.keyStorePassword", password);
    }

    public static void main(String[] args) {
        SpringApplication.run(TestApp.class, args);
    }
}

application.properties

server.port=8443
server.ssl.key-store=test2.jks
server.ssl.key-store-password=test
server.ssl.trust-store=classpath:test2.jks
server.ssl.trust-store-password=test
server.ssl.key-password=test

当我使用 mvn spring-boot:run 运行时,一切正常,但是当我将其作为可执行 jar java -jar target/xxx-xxx-service-0.1.1-SNAPSHOT.jar 运行时,我收到以下错误。

Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Could not find key store classpath:test2.jks
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.configureSslKeyStore(TomcatEmbeddedServletContainerFactory.java:292)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.configureSsl(TomcatEmbeddedServletContainerFactory.java:271)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.customizeConnector(TomcatEmbeddedServletContainerFactory.java:248)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:147)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:157)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
        ... 13 more
Caused by: java.io.FileNotFoundException: class path resource [test2.jks] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/Users/xxx/xxx/Himalay/xxx/xxx-xxx-service/target/xxx-xxx-service-0.1.17-SNAPSHOT.jar!/test2.jks
        at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:212)
        at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:175)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.configureSslKeyStore(TomcatEmbeddedServletContainerFactory.java:288)
        ... 18 more

评论application.properties后,我发现使用可执行jar命令运行时甚至无法读取test1.jks,但使用mvn spring-boot:run运行良好,如何使其使用可执行jar命令运行?

注意:如果我使用 jks 文件的绝对路径,则这两个命令都可以正常工作。

最佳答案

试试这个: String filePath= Thread.currentThread().getContextClassLoader().getResource("your-trust-store.jks").getFile(); System.setProperty("javax.net.ssl.keyStore", filepath);

关于java - "mvn spring-boot:run"与 "java jar target/xxx.jar",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37712862/

相关文章:

java - Intellij IDEA - 识别所有被忽略的 junit 测试

java - PNG 文件另存为全黑图像

java - 将参数传递给 restTemplate.getForObject 的最佳方式

java - 将 Maven 父 pom/bom (没有 java src)发布到 Nexus 的正确方法是什么

java - 如何在maven应用程序中运行war文件?

java - Spring异常处理生产与开发

java - Java适合 "Web 2.0"的应用吗?

java - 在 java servlet 中提交响应后无法转发

java - Hibernate 4.3.6 + spring - 递归删除方法

java - 在 Spring WS 中返回带有自定义错误代码和消息的 SOAP 错误对象