2016-06-01 6 views
0

Ich habe ein wirklich einfaches Projekt erstellt, um das Lesen eines Verzeichnisses oder einer Datei unter Verwendung von getClass().getResource('...').getPath() von STS, Tomcat und das Ausführen der JAR/WAR-Datei vom Terminal mit dem eingebetteten Tomcat zu testen.Spring Resource in JAR/WAR

Wie ich schon sagte, ist das Projekt einfach, hier ist der Code:

package org.example 

import org.springframework.beans.factory.annotation.Autowired 
import org.springframework.boot.CommandLineRunner 
import org.springframework.boot.SpringApplication 
import org.springframework.boot.autoconfigure.SpringBootApplication 

@SpringBootApplication 
class ResourceDemoApplication implements CommandLineRunner { 

    static void main(String[] args) { 
     SpringApplication.run ResourceDemoApplication, args 
    } 

    @Override 
    void run(String... arg0) throws Exception { 
     retrieveDirectory() 
    } 

    void retrieveDirectory() { 
     /*new File(getClass().getResource('/private/folders').getPath()).eachDirRecurse() { dir -> 
      dir.eachFileMatch(~/.*.txt/) { file -> 
       println(file.getPath()) 
      } 
     }*/ 
     println new File(getClass().getResource('/private/folders/').getPath()).isDirectory() 
    } 
} 

Wenn dieser Code in STS läuft oder wenn ich es in einem laufenden Tomcat-Instanz fallen, druckt er true. Wenn ich es als java -jar... starte, gibt es false im Terminal zurück. Ich habe mir zahllose Beispiele angeschaut und ich verstehe immer noch nicht, wie man das richtig oder wie erwartet funktioniert. Ich weiß, dass das Lesen von Dateien aus dem JAR anders ist als der Zugriff auf das Dateisystem, aber ich bin mir nicht sicher, wie ich das zum Laufen bringen kann, egal wie es eingesetzt wird.

Vielen Dank im Voraus für die Hilfe!

+0

Wie Sie bereits ein Glas ist keine Datei erwähnt und man kann sie als solche nicht lesen. Es funktioniert in einem Container, weil der Krieg entpackt wird und dann wieder eine Dateiressource ist. –

+0

So ist es nicht möglich, eine Datei/ein Verzeichnis aus einem Jar zu lesen? –

+0

Sicher kannst du aber als Datei keinen 'InputStream' verwenden, der unabhängig davon funktioniert, wie/wo die Datei gespeichert ist. –

Antwort

1

Nach einem recht wenig Forschung und in den Code zu graben, ich mit dieser Lösung endete:

package org.example 

import org.springframework.boot.CommandLineRunner 
import org.springframework.boot.SpringApplication 
import org.springframework.boot.autoconfigure.SpringBootApplication 
import org.springframework.core.io.FileSystemResource 
import org.springframework.core.io.support.PathMatchingResourcePatternResolver 

@SpringBootApplication 
class ResourceDemoApplication implements CommandLineRunner { 

    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver() 

    static void main(String[] args) { 
     SpringApplication.run ResourceDemoApplication, args 
    } 

    @Override 
    void run(String... arg0) throws Exception { 
     retrieveDirectory() 
    } 

    void retrieveDirectory() { 
     List<FileSystemResource> files = resolver.findPathMatchingResources('private/folders/**/example.txt') 

     files.each { file -> 
      println file.getInputStream().text 
     } 
    } 
} 

Mit groovigen Sie müssen nicht Arten etc erklären ... Ich tue es für die wegen der Dokumentation hier, um zu zeigen, was im Code passiert. Wenn Sie dies in Java tun, werden Sie so etwas wie dieses brauchen println file.getInputStream().text zu ersetzen:

InputStream is 
BufferedReader br 
String fileContents 
files.each { file -> 
    is = file.getInputStream() 
    br = new BufferedReader(new InputStreamReader(is)) 

    String line 
    fileContents = "" 
    while((line = br.readLine()) != null) { 
     fileContents += line 
    } 
    println fileContents 
    println "************************" 
    br.close() 
} 
+0

Netter Job mit diesem. –