질문 메모:class path resource [xx] cannot be resolved to absolute file path because

4205 단어
문제 설명
테스트 서비스 버전은 Spring Cloud Dalston입니다.SR5가 Spring Boot에서 https를 구성할 때 코드는 다음과 같습니다.
    @Bean
    @ConditionalOnExpression("#{ ${self.https.enable:false}}")
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        tomcat.addAdditionalTomcatConnectors(createSslConnector());
        return tomcat;
    }

    private Connector createSslConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

        ClassPathResource resource = new ClassPathResource(".keystore");
        try {
            connector.setScheme("https");
            connector.setSecure(true);
            connector.setPort(port);
            protocol.setSSLEnabled(true);
            protocol.setKeystoreFile(resource.getFile().getAbsolutePath());
            protocol.setKeystorePass(keystorePass);
            protocol.setKeyAlias(keyAlias);
            protocol.setKeyPass(keyPass);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return connector;
    }


상기 코드는 저희 아이디어에서 서비스를 실행할 때 정상적으로 실행할 수 있습니다.그러나 서비스를 실행 가능한jar 패키지로 포장하여jar 서비스로 서비스를 실행할 때 다음과 같은 오류가 발생합니다.
java.io.FileNotFoundException: class path resource [.keystore] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/tmp/interface
e-1.0-SNAPSHOT.jar!/BOOT-INF/classes!/.keystore
        at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:215)
        at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:53)

위와 같은 문제가 발생한 원인: 포장 후 Spring에서 Resource를 사용할 수 없습니다.getFile () 은 JAR의 경로에 접근하는 파일입니다. Resource를 사용해야 합니다.getInputStream().
수정 코드:resource.인증서 파일을 가져오고 임시 파일에 저장합니다. 마지막으로 Http11NioProtocol 실례는 이 임시 파일의 경로를 통해 값을 전송합니다. 이 Http11NioProtocol 실례는 인증서 파일을 가져올 수 있습니다.
private Connector createSslConnector() {
      Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
      Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

      ClassPathResource resource = new ClassPathResource(".keystore");
      //     
      String tempPath =System.getProperty("java.io.tmpdir") + System.currentTimeMillis()+".keystore";
      File f = new File(tempPath);
      logger.info(".keystore        " + tempPath);

      try {
          //  key         
          IOUtils.copy(resource.getInputStream(),new FileOutputStream(f));
          connector.setScheme("https");
          connector.setSecure(true);
          connector.setPort(port);
          protocol.setSSLEnabled(true);
          //       
          protocol.setKeystoreFile(f.getAbsolutePath());
          protocol.setKeystorePass(keystorePass);
          protocol.setKeyAlias(keyAlias);
          protocol.setKeyPass(keyPass);
      } catch (IOException e) {
          e.printStackTrace();
      }

      return connector;
  }

좋은 웹페이지 즐겨찾기