2016-06-01 3 views
0

Я создал действительно простой проект для тестирования чтения каталога или файла с помощью getClass().getResource('...').getPath() от STS, Tomcat и запуска файла JAR/WAR с терминала со встроенным Tomcat.Spring Resource Inside JAR/WAR

Как я уже сказал, проект просто, вот код:

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() 
    } 
} 

Если этот код работает в STS или если уронить его в запущенный экземпляр Tomcat, он печатает true. Когда я запускаю его как java -jar..., он возвращает false в терминал. Я посмотрел на бесчисленные примеры, и я до сих пор не понимаю, как заставить это работать должным образом или как ожидалось. Я знаю, что чтение файлов из JAR отличается от доступа к файловой системе, но я не уверен, как заставить это работать независимо от того, как он развернут.

Заранее благодарю за помощь!

+0

Как уже упоминалось баночка не файл, и вы не можете прочитать его как таковой. Он работает в контейнере, потому что война распаковывается, а затем снова является файловым ресурсом. –

+0

Так не возможно ли прочитать файл/каталог из банки? –

+0

Конечно, вы можете, но не как файл, использовать 'InputStream', который будет работать независимо от того, как/где хранится файл. –

ответ

1

После довольно много исследований и копаться в коде, я закончил с этим решением:

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 
     } 
    } 
} 

С заводной вам не нужно объявлять типы и т.д ... Я делаю это для ради документации здесь, чтобы показать, что происходит в коде. Если вы делаете это в Java вам потребуется что-то вроде этого, чтобы заменить println file.getInputStream().text:

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

Хорошая работа с этим. –

Смежные вопросы