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


86

私は次のディレクトリレイアウトを持っています:

  • 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")(できれば春が望ましい)のようなもの、またはservletContextでポイントするために何をすべきresources/sqlですか?


ソリューションの3つの変形は、状況に応じて、ありますstackoverflow.com/a/56327069/715269
Gangnus

回答:


69

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

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

ありがとう!これは私にとってはうまくいきました。そのURLを使用して、新しいファイルのパスを作成し、最後にそのディレクトリにファイルを取得します。
yamilmedina 2013年

2
ファイルは必要ありません。あなたはすでにURLを持っています。ファイルやディレクトリがあるとはまったく想定できません。WARが開梱されていない可能性があります。
ローンの侯爵2013年

ここでMyServletContextListenerはどういう意味ですか?
Tejesh Raut 2015

@TejeshRautこれは、を実装するクラスのプレースホルダーですjavax.servlet.ServletContextListener。質問にはインターフェースcontextInitialized によって定義されたメソッドであるスニペットが含まれていたため、これを例として使用しましたServletContextListener
Dev

59

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

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"機能します。
アブダル

2
this.getClass()。getResource( "/ sql"));を使用して別のURLを取得できることに注意してください。
ShadowGames

これはすべてのコンテナで機能するとは限りません。たとえば、Tomcat。
ローン侯爵

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

...

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

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


6

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

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

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


1
コードがjarファイルから実行されている間のリソースの取得もサポートしていますか?
19
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.