2016-06-08 4 views
0

Um zu aktivieren https in meiner Spring-Boot-App habe ich Folgendes getan.Resource FileNotFoundException bei der Verwendung von ausführbaren jar Befehl mit Spring-Boot

@Bean 
@Inject 
public EmbeddedServletContainerCustomizer containerCustomizer() throws FileNotFoundException 
{ 
    final String absoluteKeystoreFile = ZenoTuringServiceApp.class.getClassLoader().getResource("test.jks").getFile(); 

    return (ConfigurableEmbeddedServletContainer factory) -> { 
     TomcatEmbeddedServletContainerFactory containerFactory = (TomcatEmbeddedServletContainerFactory) factory; 
     containerFactory.addConnectorCustomizers((TomcatConnectorCustomizer) (Connector connector) -> { 
      connector.setSecure(true); 
      connector.setScheme("https"); 
      connector.setAttribute("keystoreFile", absoluteKeystoreFile); 
      connector.setAttribute("keystorePass", "test"); 
      connector.setAttribute("keystoreType", "JKS"); 
      connector.setAttribute("clientAuth", "false"); 
      connector.setAttribute("sslProtocol", "TLS"); 
      connector.setAttribute("SSLEnabled", true); 
     }); 
    }; 
} 

Wenn ich es laufen mvn feder Boot mit: führen Sie es wie erwartet funktioniert.

Aber wenn ich mit der ausführbaren jar mit java -jar target/xxx-xxx-service-0.1.17-SNAPSHOT.jar ausführen, bekomme ich die FileNotFoundException.

Caused by: org.apache.catalina.LifecycleException: service.getName(): "Tomcat"; Protocol handler start failed 
     at org.apache.catalina.connector.Connector.startInternal(Connector.java:993) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     ... 18 common frames omitted 

Caused by: java.io.FileNotFoundException: /private/var/folders/wl/xxx77_523z44yjdgx2y7xxxc217h/T/tomcat.8061417798873093914.8091/file:/Users/xxx/Work/Himalay/xxx/xxx-xxx-service/target/xxx-xxx-service-0.1.17-SNAPSHOT.jar!/test.jks (No such file or directory) 
     at java.io.FileInputStream.open0(Native Method) 
     at java.io.FileInputStream.open(FileInputStream.java:195) 
     at java.io.FileInputStream.<init>(FileInputStream.java:138) 
     at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getStore(JSSESocketFactory.java:433) 
     at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeystore(JSSESocketFactory.java:339) 
     at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:597) 
+1

Sie nicht eine Ressource (innerhalb eines JAR) als 'File' verweisen können. Sie ** müssen ** einen InputStream verwenden. Daher sollte 'keystoreFile' wahrscheinlich außerhalb Ihres JAR liegen, da Tomcat anscheinend einen Pfad zu einer' Datei' erwartet. – Tunaki

+0

Da Sie dies außerhalb von Tomcat ausführen, haben Sie keine "Web" -Gläser dabei. Sie müssen die 'Java EE from Tomcat'-Bibliothek einschließen. – Grayson

+2

das könnte hilfreich sein https://kamwo.me/java-load-file-from-classpath-in-spring-boot/ – austin

Antwort

0

Die Kommentare oben und dieser Code hat mir geholfen ..

// support loading the JKS from the classpath (to get around Tomcat limitation) 
private static File getTuringKeyStoreFile() throws IOException { 
    ClassPathResource resource = new ClassPathResource("test.jks"); 

    // Tomcat won't allow reading File from classpath so read as InputStream into temp File 
    File jks = File.createTempFile("ssl_keystore", ".jks"); 
    InputStream inputStream = resource.getInputStream(); 
    try { 
     FileUtils.copyInputStreamToFile(inputStream, jks); 
    } finally { 
     IOUtils.closeQuietly(inputStream); 
    } 

    return jks; 
} 

Referenz: https://github.com/robinhowlett/everything-ssl

Verwandte Themen