Spring Maven 从资源文件夹中读取

Posted

技术标签:

【中文标题】Spring Maven 从资源文件夹中读取【英文标题】:Spring Maven reading from resources folder 【发布时间】:2019-10-16 07:15:19 【问题描述】:

我正在使用 Spring Boot。我想读取 src/main/resources 文件夹中的 json 文件。

File file = new File(this.getClass().getClassLoader().getResource(inputFileName).getFile());

马文:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
            <attribute name="test" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

现在,当我使用 Spring Tools(Run As -> Spring Boot App)在 Eclipse 中运行 Spring Boot 应用程序时,我得到 NoSuchFileException 并且应用程序试图在 /target/classes/ 而不是 /src/ 中查找文件主/资源文件夹。

另外,我看不到 /target/classes/ 文件夹中的文件。为什么 maven 不将其复制到目标/类?

如何从资源文件夹中读取数据?

【问题讨论】:

停止使用文件 IO 读取类路径资源。类路径资源在运行时不在文件系统上,而是捆绑在 jar 文件中。只需使用 getResourceAsStream(),您就会拥有一个可供读取的 InputStream。你不需要文件。 在Eclipse中,选择spring boot项目,按ALT+F5,然后按ok。尝试作为 Spring Boot 应用程序运行。 【参考方案1】:

如果你在一个普通的 maven java 项目中工作。 src/main/resources 默认在类路径中。所以用maven打包的时候可以访问它下面的文件。即使在 Eclipse 项目中,resources 中的文件也会被复制到target/classes 文件夹中。所以没问题。

【讨论】:

但是资源没有被复制到 target/classes 文件夹。它们何时被复制? 一旦项目建成。复制将会发生。 文件夹应该是资源,而不是资源,每个 maven.apache.org/guides/introduction/…【参考方案2】:

您不必使用文件来读取内容。你可以打电话

this.getClass().getResourceAsStream(inputFileName)

无论你有 JAR/WAR 文件还是在 eclipse 中运行它,它都可以工作。正如袁指出的那样,资源将在构建后被复制并捆绑在文件中。 Eclipse 管理 maven 类路径,并在应用程序执行时将适当的条目添加到类路径中。

【讨论】:

以上是关于Spring Maven 从资源文件夹中读取的主要内容,如果未能解决你的问题,请参考以下文章

spring @PropertySource 读取资源文件

Spring Boot参考教程Spring Boot Jar方式读取资源文件

Java 如何读取resources

使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源

docker上的Spring启动无法从资源中读取属性文件,但可以在没有Docker的情况下使用java -jar

如何从 Android Studio 的资源目录中读取 json 文件?