2017-01-20 24 views
6

Próbuję odczytać plik tekstowy za pomocą ładowacza Wiosna zasobów tak:Wiosna Boot - Odczyt pliku tekstowego za pomocą ResourceLoader

Resource resource = resourceLoader.getResource("classpath:\\static\\Sample.txt"); 

Plik lokalizuje w moim wiosennym projekcie boot: enter image description here

Działa dobrze podczas uruchamiania aplikacji w środowisku Eclipse, ale gdy pakiet aplikacji, uruchom go za pomocą java -jar, otrzymam plik nie znaleziono wyjątek:

java.io.FileNotFoundException: class path resource [static/Sample.txt] cannot be resolved to absolute file path because it does not reside in the 
file system: jar:file:/C:/workspace-test/XXX/target/XXX-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/static/Sample.txt 

I unziped plik Jar próbka znajdzie się w: XXX-0.0.1-SNAPSHOT \ BOOT-INF \ Classes \ static \ sample.txt

Czy ktoś może mi pomóc proszę?

Z góry dziękuję!

+0

trzeba rozpakować plik jar, aby zobaczyć gdzie jest próbka .txt.Maybe został przeniesiony podczas pakowania. –

+0

Zrobiłem to: XXX-0.0.1-SNAPSHOT \ BOOT-INF \ classes \ static \ Sample.txt – Greg

+0

Proszę wydrukuj zmienną CLASSPATH na powłoce i pokaż jej wartość. 'echo% classpath%'. – VHS

Odpowiedz

11

Sprawdziłem Twój code.If chcesz załadować plik ze ścieżki klasy w słoiku Wiosna Boot , musisz użyć wartości resource.getInputStream() zamiast resource.getFile(). Jeśli spróbujesz użyć metody resource.getFile(), pojawi się błąd, ponieważ Spring próbuje uzyskać dostęp do ścieżki systemu plików, ale nie może uzyskać dostępu do ścieżki w twoim pliku JAR.

szczegółowo, jak poniżej:

https://smarterco.de/java-load-file-classpath-spring-boot/

+0

Dziękuję, szukałem tej odpowiedzi od lat !!! – Custard

0

Spróbuj resourceLoader.getResource("classpath:static/Sample.txt");

Praca z tym kodem po uruchomieniu z java -jar XXXX.jar

enter image description here

------ aktualizacja ------

Po przejść kodów , prawdziwym problemem jest próba odczytania pliku przez FileInputStream, ale w rzeczywistości znajduje się on w pliku JAR.

Ale faktycznie Ci w org.springframework.core.io.Resource tak oznacza, że ​​naprawdę InputStream, więc można to zrobić jak new BufferedReader(new InputStreamReader(resource.getInputStream())).readLine();

+0

Niestety, prawie ten sam błąd – Greg

+0

Nie pracować dla mnie, może bcs używam Spring Boot? – Greg

+0

@Greg Tak, używam Spring Boot 1.4.3, jaka jest dokładna wersja dla ciebie? –

0

miałem ten sam problem i jak wyjaśniono @Gipple Lake z wiosennego startu trzeba załadować pliku jako InputStream. Tak ryczeć dodam mój kod jako przykład, gdy chcę odczytać pliku import.xml

public void init() { 
    Resource resource = new ClassPathResource("imports/imports.xml"); 
    try { 
     InputStream dbAsStream = resource.getInputStream(); 
     try { 
      document = readXml(dbAsStream); 
      } catch (SAXException e) { 
       trace.error(e.getMessage(), e); 
       e.printStackTrace(); 
      } catch (ParserConfigurationException e) { 
       trace.error(e.getMessage(), e); 
       e.printStackTrace(); 
      } 
    } catch (IOException e) { 
     trace.error(e.getMessage(), e); 
     e.printStackTrace(); 
    } 
    initListeImports(); 
    initNewImports(); 
} 

public static Document readXml(InputStream is) throws SAXException, IOException, 
     ParserConfigurationException { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

     dbf.setValidating(false); 
     dbf.setIgnoringComments(false); 
     dbf.setIgnoringElementContentWhitespace(true); 
     dbf.setNamespaceAware(true); 
     DocumentBuilder db = null; 
     db = dbf.newDocumentBuilder(); 

     return db.parse(is); 
    } 

dodałem „imports.xml” ryczeć src/main/ressources/imports