Spring 缺少引导访问静态资源 scr/main/resources
Spring Boot access static resources missing scr/main/resources
我正在开发 Spring 启动应用程序。我需要在开始时解析一个 XML 文件 (countries.xml)。问题是我不知道把它放在哪里才能访问它。
我的文件夹结构是
ProjectDirectory/src/main/java
ProjectDirectory/src/main/resources/countries.xml
我的第一个想法是将它放在 src/main/resources 中,但是当我尝试创建文件 (countries.xml) 时,我得到了一个 NPE,堆栈跟踪显示我的文件在 ProjectDirectory (所以 src/main/resources/ 未添加)。我尝试创建文件 (resources/countries.xml) 并且路径看起来像 ProjectDirectory/resources/countries.xml (所以再次 src/main 未添加)。
我尝试添加这个但没有结果
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
super.addResourceHandlers(registry);
}
我知道我可以手动添加 src/main/,但我想了解为什么它无法正常工作。我还尝试了 ResourceLoader 的示例 - 但同样没有结果。
谁能告诉我问题出在哪里?
更新:
仅供将来参考 - 在构建项目后,我遇到了访问文件的问题,所以我将 File 更改为 InputStream
InputStream is = new ClassPathResource("countries.xml").getInputStream();
只需使用 Spring 输入 ClassPathResource.
File file = new ClassPathResource("countries.xml").getFile();
只要这个文件在类路径中的某处,Spring 就会找到它。这可以是 src/main/resources
在开发和测试期间。在生产中,它可以是当前 运行 目录。
编辑: 如果文件在 fat JAR 中,则此方法不起作用。在这种情况下,您需要使用:
InputStream is = new ClassPathResource("countries.xml").getInputStream();
获取类路径中的文件:
Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();
要在启动时读取文件,请使用 @PostConstruct
:
@Configuration
public class ReadFileOnStartUp {
@PostConstruct
public void afterPropertiesSet() throws Exception {
//Gets the XML file under src/main/resources folder
Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();
//Logic to read File.
}
}
这里是 Small example 用于在 Spring Boot App 启动时读取 XML 文件。
在使用 Spring 启动应用程序时,当它部署为 JAR 时,很难使用 resource.getFile()
获取类路径资源,因为我遇到了同样的问题。
此扫描使用 Stream 解决,它将找出放置在类路径中任何位置的所有资源。
下面是相同的代码片段 -
ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);
您需要使用以下构造
InputStream in = getClass().getResourceAsStream("/yourFile");
请注意,您必须在文件名前添加斜杠。
您可以使用以下代码从资源文件夹中读取字符串中的文件。
final Resource resource = new ClassPathResource("public.key");
String publicKey = null;
try {
publicKey = new String(Files.readAllBytes(resource.getFile().toPath()), StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
我用spring启动,所以我可以简单使用:
File file = ResourceUtils.getFile("classpath:myfile.xml");
我用Spring引导,我的解决方法是
"src/main/resources/myfile.extension"
希望对大家有所帮助。
Because java.net.URL is not adequate for handling all kinds of low level resources, Spring introduced org.springframework.core.io.Resource. To access resources, we can use @Value annotation or ResourceLoader class.
@Autowired
private ResourceLoader resourceLoader;
@Override
public void 运行(String...args) 抛出异常 {
Resource res = resourceLoader.getResource("classpath:thermopylae.txt");
Map<String, Integer> words = countWords.getWordsCount(res);
for (String key : words.keySet()) {
System.out.println(key + ": " + words.get(key));
}
}
我正在开发 Spring 启动应用程序。我需要在开始时解析一个 XML 文件 (countries.xml)。问题是我不知道把它放在哪里才能访问它。 我的文件夹结构是
ProjectDirectory/src/main/java
ProjectDirectory/src/main/resources/countries.xml
我的第一个想法是将它放在 src/main/resources 中,但是当我尝试创建文件 (countries.xml) 时,我得到了一个 NPE,堆栈跟踪显示我的文件在 ProjectDirectory (所以 src/main/resources/ 未添加)。我尝试创建文件 (resources/countries.xml) 并且路径看起来像 ProjectDirectory/resources/countries.xml (所以再次 src/main 未添加)。
我尝试添加这个但没有结果
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
super.addResourceHandlers(registry);
}
我知道我可以手动添加 src/main/,但我想了解为什么它无法正常工作。我还尝试了 ResourceLoader 的示例 - 但同样没有结果。
谁能告诉我问题出在哪里?
更新: 仅供将来参考 - 在构建项目后,我遇到了访问文件的问题,所以我将 File 更改为 InputStream
InputStream is = new ClassPathResource("countries.xml").getInputStream();
只需使用 Spring 输入 ClassPathResource.
File file = new ClassPathResource("countries.xml").getFile();
只要这个文件在类路径中的某处,Spring 就会找到它。这可以是 src/main/resources
在开发和测试期间。在生产中,它可以是当前 运行 目录。
编辑: 如果文件在 fat JAR 中,则此方法不起作用。在这种情况下,您需要使用:
InputStream is = new ClassPathResource("countries.xml").getInputStream();
获取类路径中的文件:
Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();
要在启动时读取文件,请使用 @PostConstruct
:
@Configuration
public class ReadFileOnStartUp {
@PostConstruct
public void afterPropertiesSet() throws Exception {
//Gets the XML file under src/main/resources folder
Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();
//Logic to read File.
}
}
这里是 Small example 用于在 Spring Boot App 启动时读取 XML 文件。
在使用 Spring 启动应用程序时,当它部署为 JAR 时,很难使用 resource.getFile()
获取类路径资源,因为我遇到了同样的问题。
此扫描使用 Stream 解决,它将找出放置在类路径中任何位置的所有资源。
下面是相同的代码片段 -
ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);
您需要使用以下构造
InputStream in = getClass().getResourceAsStream("/yourFile");
请注意,您必须在文件名前添加斜杠。
您可以使用以下代码从资源文件夹中读取字符串中的文件。
final Resource resource = new ClassPathResource("public.key");
String publicKey = null;
try {
publicKey = new String(Files.readAllBytes(resource.getFile().toPath()), StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
我用spring启动,所以我可以简单使用:
File file = ResourceUtils.getFile("classpath:myfile.xml");
我用Spring引导,我的解决方法是
"src/main/resources/myfile.extension"
希望对大家有所帮助。
Because java.net.URL is not adequate for handling all kinds of low level resources, Spring introduced org.springframework.core.io.Resource. To access resources, we can use @Value annotation or ResourceLoader class. @Autowired private ResourceLoader resourceLoader;
@Override public void 运行(String...args) 抛出异常 {
Resource res = resourceLoader.getResource("classpath:thermopylae.txt");
Map<String, Integer> words = countWords.getWordsCount(res);
for (String key : words.keySet()) {
System.out.println(key + ": " + words.get(key));
}
}