web-dev-qa-db-ja.com

プログラムでリソースディレクトリパスを取得する方法

次のディレクトリレイアウトがあります。

  • src
    • メイン
      • Java
      • 資源
        • sql(データベースのスクリプト)
        • スプリング(構成)
      • webapp

ServletContextListenerクラス内で、SQLディレクトリの下のファイルにアクセスし、それらをリストしたい。基本的に私の問題はパスにあります。なぜなら、簡単に言えば、ディレクトリの下のファイルのリストは次のとおりだからです。

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

ServletContextEventオブジェクトを使用して、resources/sqlへのパスを作成しようとした可能性があります

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

そのパスをハードコードされていない相対的な方法で設定するものはありますか? new File("classpath:sql")(できれば春が望ましい)のようなもの、またはresources/sqlを指すようにservletContextを使用してどうすればよいですか?

68
whyem

src/main/resources/の内容は、ビルド時に.war内のWEB-INF/classes/にコピーされると想定しています。その場合は、クラスクラスとロードされているパスを実際の値に置き換えるだけで済みます。

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

最後に、これは私がやったことです:

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();
48
whyem
import org.springframework.core.io.ClassPathResource;

...

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

これにより、展開オプションが制限されることに注意してください。ClassPathResource.getFile()は、コンテナがwarファイルを展開(解凍)した場合にのみ機能します。

15
samlewis

com.google.common.io.Resources classを使用するだけです。例:

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

その後、次のようなメソッドがあります:。getContent()、.getFile()、.getPath()など

3
grep