복붙노트

[SPRING] Spring 부트 액세스 정적 리소스 scr / main / resources 누락

SPRING

Spring 부트 액세스 정적 리소스 scr / main / resources 누락

나는 스프링 부트 애플리케이션을 개발 중이다. 시작할 때 XML 파일 (countries.xml)을 구문 분석해야합니다. 문제는 내가 어디에 접근 할 수 있는지 이해할 수 없다는 것입니다. 내 폴더 구조는 다음과 같습니다.

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

내 첫 번째 생각은 src / main / resources에 넣는 것이었지만 File (countries.xml)을 만들려고 할 때 NPE를 얻었고 stacktrace는 내 파일이 ProjectDirectory에서 찾았 음을 보여줍니다 (src / main / resources / 추가되지 않음). File (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 / manually를 추가 할 수 있다는 것을 알고 있지만 왜 그렇게 작동하지 않는지 이해하고 싶다. 또한 ResourceLoader를 사용하여 예제를 시도했지만 결과는 같습니다.

누구든지 문제가 무엇인지 제안 할 수 있습니까?

최신 정보: 향후 참조 용으로 - 프로젝트를 빌드 한 후에 파일에 액세스 할 때 문제가 발생하여 File을 InputStream으로 변경했습니다.

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

해결법

  1. ==============================

    1.스프링 타입 ClassPathResource 만 사용하면됩니다.

    스프링 타입 ClassPathResource 만 사용하면됩니다.

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

    이 파일이 classpath 어딘가에 있다면, Spring은 그것을 발견 할 것이다. 이것은 개발 및 테스트 중에 src / main / resources가 될 수 있습니다. 프로덕션 환경에서는 현재 실행중인 디렉토리 일 수 있습니다.

  2. ==============================

    2.클래스 경로에서 파일을 가져 오려면 다음을 수행하십시오.

    클래스 경로에서 파일을 가져 오려면 다음을 수행하십시오.

    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.
        }
    }
    

    다음은 봄 부팅 응용 프로그램 시작시 XML 파일을 읽는 작은 예제입니다.

  3. ==============================

    3.Spring Boot 애플리케이션으로 작업하는 동안 동일한 문제에 직면했을 때 JAR로 전개 될 때 resource.getFile ()을 사용하여 클래스 경로 자원을 확보하기가 어렵습니다. 이 스캔은 Streampath를 사용하여 해결되며 클래스 패스의 어느 위치 에나 배치 된 모든 리소스를 찾습니다.

    Spring Boot 애플리케이션으로 작업하는 동안 동일한 문제에 직면했을 때 JAR로 전개 될 때 resource.getFile ()을 사용하여 클래스 경로 자원을 확보하기가 어렵습니다. 이 스캔은 Streampath를 사용하여 해결되며 클래스 패스의 어느 위치 에나 배치 된 모든 리소스를 찾습니다.

    다음은 같은 코드 스 니펫입니다.

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

    4.다음 코드를 사용하여 리소스 폴더에서 String 파일을 읽을 수 있습니다.

    다음 코드를 사용하여 리소스 폴더에서 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();
    }
    
  5. ==============================

    5.다음과 같은 구조를 사용해야합니다.

    다음과 같은 구조를 사용해야합니다.

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

    파일 이름 앞에 슬래시를 추가해야합니다.

  6. from https://stackoverflow.com/questions/36371748/spring-boot-access-static-resources-missing-scr-main-resources by cc-by-sa and MIT license