如何以编程方式获取资源目录路径
Posted
技术标签:
【中文标题】如何以编程方式获取资源目录路径【英文标题】:How to get resources directory path programmatically 【发布时间】:2013-10-25 05:15:18 【问题描述】:我有以下目录布局:
源 主要 java 资源 sql(数据库脚本) 弹簧(配置) 网络应用
在 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")
之类的东西(如果可能的话最好是 spring)或者我应该用 servletContext 做什么来指向resources/sql
?
【问题讨论】:
解决方案有三种变体,视情况而定:***.com/a/56327069/715269 【参考方案1】:import org.springframework.core.io.ClassPathResource;
...
File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();
值得注意的是,这将限制您的部署选项,ClassPathResource.getFile()
仅在容器已分解(解压缩)您的 war 文件时才有效。
【讨论】:
【参考方案2】:我假设src/main/resources/
的内容在构建时被复制到您的.war 中的WEB-INF/classes/
。如果是这种情况,您可以这样做(用实际值替换类名和正在加载的路径)。
URL sqlScriptUrl = MyServletContextListener.class
.getClassLoader().getResource("sql/script.sql");
【讨论】:
谢谢!!这对我有用,使用该 URL 然后我为新文件构建路径,最后获取该目录中的文件。 您不需要该文件。您已经有一个 URL。你甚至不能假设有一个文件或一个目录。 WAR 可能尚未解压缩。 这里的 MyServletContextListener 是什么意思? @TejeshRaut 它是实现javax.servlet.ServletContextListener
的类的占位符。我用它作为例子是因为问题有一个来自contextInitialized
的sn-p,这是ServletContextListener
接口定义的方法。
对我来说,在路径前加上classpath:
至关重要,所以:"classpath:/sql/script.sql"
。【参考方案3】:
最后,这就是我所做的:
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();
【讨论】:
您确定使用"/sql"
作为参数吗?我的斜线有问题,取而代之的是 "sql"
工作。
请注意,您可以使用 this.getClass().getResource("/sql")); 获取不同的 URL;
这不适用于所有容器。以 Tomcat 为例。【参考方案4】:
只需使用 com.google.common.io.Resources 类。示例:
URL url = Resources.getResource("file name")
之后,您可以使用以下方法:.getContent()、.getFile()、.getPath() 等
【讨论】:
它们是否也支持在从 jar 文件执行代码时获取资源?以上是关于如何以编程方式获取资源目录路径的主要内容,如果未能解决你的问题,请参考以下文章
如何在wildfly服务器中以编程方式热重载静态资源(如xhtml)以获取爆炸战争中存在的库