简体   繁体   中英

Spring Resource Inside JAR/WAR

I created a really simple project to test reading a directory or file using getClass().getResource('...').getPath() from STS, Tomcat, and running the JAR/WAR file from the terminal with the embedded Tomcat.

Like I said, the project is simple, here's the 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()
    }
}

When this code runs in STS or if I drop it in a running Tomcat instance, it prints true . When I run it as java -jar... , it returns false in the terminal. I have looked at countless examples and I still don't understand how to get this to work properly or as expected. I know that reading files from inside the JAR is different than having access to the file system, but I'm not sure how to get this to work regardless of how it's deployed.

Thank you in advance for the help!

After quite a bit of research and digging into the code, I ended up with this solution:

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

With groovy you don't need to declare types etc... I am doing it for the sake of documentation here to show what's happening in the code. If you do this in Java you will need something like this to replace 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()
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM