Spring 启动访问缺少 scr/main/resources 的静态资源

我正在开发一个 Spring Boot 应用程序。我需要在开始时解析一个 XML 文件(country ies.XML)。问题是,我不知道把它放在哪里,这样我就可以访问它。 我的文件夹结构是

ProjectDirectory/src/main/java
ProjectDirectory/src/main/resources/countries.xml

我的第一个想法是把它放在 src/main/resources 中,但是当我尝试创建 File (country ies.xml)时,我得到一个 NPE,堆栈跟踪显示我的文件在 ProjectDirectory 中查找(所以 src/main/resources/没有添加)。我尝试创建 File (resources/country ies.xml) ,路径类似于 ProjectDirectory/resources/country ies.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 的示例——结果是一样的 no。

有人能告诉我问题出在哪里吗?

更新: 只是为了将来的参考-在建立项目后,我遇到了访问文件的问题,所以我改变文件到 InputStream

InputStream is = new ClassPathResource("countries.xml").getInputStream();
142319 次浏览

只需使用 Spring 类型 课程资源

File file = new ClassPathResource("countries.xml").getFile();

只要这个文件在类路径上的某个地方,Spring 就会找到它。在开发和测试期间,这可以是 src/main/resources。在生产中,它可以是当前正在运行的目录。

编辑: 如果文件在胖 JAR 中,这种方法就不起作用。在这种情况下,您需要使用:

InputStream is = new ClassPathResource("countries.xml").getInputStream();

要获取类路径中的文件:

Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();

要读取文件 onStartup 使用 @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.
}
}

下面是用于在 SpringBootApp 启动时读取 XML 文件的 举个小例子

在使用 Spring Boot 应用程序时,当使用 resource.getFile()作为 JAR 部署时,很难获得类路径资源,因为我面临同样的问题。 这个扫描可以使用 Stream 来解析,它会找出放置在类路径中任何位置的所有资源。

下面是同一个-的代码片段

ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);

您需要使用以下结构

InputStream in = getClass().getResourceAsStream("/yourFile");

请注意,您必须在文件名之前添加这个斜杠。

可以使用以下代码从资源文件夹中读取 String 中的文件。

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();
}

我使用弹簧靴,所以我可以简单地使用:

File file = ResourceUtils.getFile("classpath:myfile.xml");

我使用 Spring Boot,我的解决方案是

"src/main/resources/myfile.extension"

希望能帮到别人。

由于 java.net.URL 不足以处理所有低级资源,Spring 引入了 org.springframework.core.io。资源。要访问资源,可以使用@Value 注释或 ResourceLoader 类。 @ Autowired 私有资源加载器;

@ 重写 Public void run (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));
}
}