질문 메모:class path resource [xx] cannot be resolved to absolute file path because
테스트 서비스 버전은 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.