次のディレクトリレイアウトがあります。
- 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を使用してどうすればよいですか?
src/main/resources/
の内容は、ビルド時に.war内のWEB-INF/classes/
にコピーされると想定しています。その場合は、クラスクラスとロードされているパスを実際の値に置き換えるだけで済みます。
URL sqlScriptUrl = MyServletContextListener.class
.getClassLoader().getResource("sql/script.sql");
最後に、これは私がやったことです:
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();
import org.springframework.core.io.ClassPathResource;
...
File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();
これにより、展開オプションが制限されることに注意してください。ClassPathResource.getFile()
は、コンテナがwarファイルを展開(解凍)した場合にのみ機能します。
com.google.common.io.Resources classを使用するだけです。例:
URL url = Resources.getResource("file name")
その後、次のようなメソッドがあります:。getContent()、.getFile()、.getPath()など