프로그래밍 방식으로 리소스 디렉터리 경로를 가져 오는 방법


90

다음과 같은 디렉토리 레이아웃이 있습니다.

  • src
    • 본관
      • 자바
      • 자원
        • sql (데이터베이스 용 스크립트)
        • 봄 (구성)
      • 웹앱

ServletContextListener 클래스 내에서 SQL 디렉토리 아래의 파일에 액세스하여 나열하려고합니다. 기본적으로 내 문제는 경로에 있습니다. 왜냐하면 간단히 말해서 디렉토리 아래에 파일을 나열한다는 것을 알고 있기 때문입니다.

File folder = new File(path);
File[] listOfFiles = folder.listFiles();

ServletContextEventObject를 사용하여 경로를 만들 수 있습니다.resources/sql

public void contextInitialized(ServletContextEvent event) {
    event.getServletContext(); //(getRealPath etc.)
}

상대 경로를 하드 코딩되지 않은 방식으로 설정하는 것이 있습니까? 같은 것 new File("classpath:sql")(가능하다면 봄이 좋습니다) 또는 servletContext로 무엇을 가리켜 야 resources/sql합니까?


상황에 따라 솔루션에는 세 가지 변형이 있습니다. stackoverflow.com/a/56327069/715269
Gangnus

답변:


70

의 내용이 빌드 타임에 .war 내부에 src/main/resources/복사 되었다고 가정합니다 WEB-INF/classes/. 이 경우 그냥 할 수 있습니다 (클래스 이름과로드되는 경로의 실제 값으로 대체).

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");

감사!! 이 URL을 사용하여 새 파일의 경로를 만들고 마지막으로 해당 디렉토리에 파일을 가져옵니다.
yamilmedina

2
파일이 필요하지 않습니다. 이미 URL이 있습니다. 파일이나 디렉토리가 있다고 가정 할 수도 없습니다. WAR이 풀리지 않았을 수 있습니다.
user207421 2013-10-18

여기서 MyServletContextListener는 무엇을 의미합니까?
Tejesh Raut 2015

@TejeshRaut 구현하는 클래스의 자리 표시 자입니다 javax.servlet.ServletContextListener. 질문 contextInitializedServletContextListener인터페이스에 의해 정의 된 메서드 인 코드 조각이 있었기 때문에 예제로 사용했습니다 .
Dev

63

마지막으로 내가 한 일입니다.

private File getFileFromURL() {
    URL url = this.getClass().getClassLoader().getResource("/sql");
    File file = null;
    try {
        file = new File(url.toURI());
    } catch (URISyntaxException e) {
        file = new File(url.getPath());
    } finally {
        return file;
    }
}

...

File folder = getFileFromURL();
File[] listOfFiles = folder.listFiles();

11
당신은 반드시 사용 있습니까 "/sql"매개 변수로? 시작 슬래시에 문제가 있지만 대신 "sql"작동합니다.
Abdull

2
this.getClass (). getResource ( "/ sql"));로 다른 URL을 얻을 수 있습니다.
ShadowGames 2010 년

이것은 모든 컨테이너에서 작동하지 않습니다. 예를 들어 톰캣.
user207421

16
import org.springframework.core.io.ClassPathResource;

...

File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();

이것은 배포 옵션을 제한 ClassPathResource.getFile()하고 컨테이너가 war 파일을 폭발 (압축 해제) 한 경우에만 작동 한다는 점에 주목할 가치가 있습니다.


7

com.google.common.io.Resources 클래스를 사용하십시오 . 예:

 URL url = Resources.getResource("file name")

그 후에 .getContent (), .getFile (), .getPath () 등과 같은 메소드가 있습니다.


1
jar 파일에서 코드가 실행되는 동안 리소스 가져 오기도 지원합니까?
Displee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.