JAR / WAR中的Spring资源

时间:2016-06-01 13:56:57

标签: java spring groovy

我创建了一个非常简单的项目,用于测试从STS,Tomcat使用getClass().getResource('...').getPath()读取目录或文件,并使用嵌入式Tomcat从终端运行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内部读取文件与访问文件系统不同,但我不知道如何将其工作,无论它是如何部署的。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分: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
        }
    }
}

使用groovy你不需要声明类型等...我这样做是为了记录这里的文档,以显示代码中发生了什么。如果您在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()
}