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 Boot参考教程Spring Boot Jar方式读取资源文件
使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源