【问题标题】:Relative file path with "user.dir" system property具有“user.dir”系统属性的相对文件路径
【发布时间】:2015-09-25 14:19:32
【问题描述】:

我正在尝试在服务器上的 Web 应用程序中读取本地文件。在部署到 JBoss 之外对此进行测试时,文件路径是正确的。但是,当我将它部署到 JBoss 时,文件路径会更改 JBoss 的 bin 目录。 user.dir 系统属性在部署为战争时会发生变化。

如何在不使用绝对文件路径的情况下防止这种情况发生?

我想避免使用绝对文件路径,因为项目需要在具有不同目录结构的多台机器上复制。

String curDir = System.getProperty("user.dir");

String fileLocation = curDir.toString() + "/end/of/path/to/flat.json";
JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(fileLocation)));

【问题讨论】:

  • 在 servlet 环境中,不应使用来自用户目录的相对路径。
  • @meskobalazs 我读了一些关于类路径资源的文章。那是我应该研究的更多吗?
  • 这样会更好。
  • @UltraSonja 如果你有不同结构的不同机器,你应该有一些配置设置来设置你的基本目录并使所有路径都与此相关。这可确保您在各个方向上都具有最大的灵活性。
  • 如果需要推送并且您必须将文件保存在文件系统中,您可以使用 servlet 初始化参数或类似机制来传递外部目录的路径。依赖当前目录或user.dir 在网络应用程序中是个坏主意。

标签: java


【解决方案1】:

您是否尝试过从

HttpServeltRequest.getServletContext().getRealPath("META-INT/aop.xml");

它为您提供当前操作系统的真实路径。

问候,

金融时报

【讨论】:

    【解决方案2】:

    感谢this question and answer 我找到了解决方案。我不确定这是否是最好的方法,但它确实有效。我在我的网络应用程序中添加了src/main/resources 文件夹,并将我需要访问的文件放在那里。

    来自 src/main/resources 的资源将被放在类路径的根目录下,因此您需要以如下方式获取资源:

    代码:

    String file = "/flat.json";
    
    JsonReader reader = new JsonReader(new InputStreamReader(getClass().getResourceAsStream(file)));
    

    【讨论】:

    • 适用于在创建 WAR 时或之前创建的文件。部署后不要添加到资源中。
    • @JoseMartinez 那么对于不是在构建时或之前创建的文件,我会使用什么方法呢?在实时环境中,文件将定期生成。
    • 如果文件只是临时需要,则使用tmp.dir;适合缓存。如果在同一容器实例上的部署之间需要文件(例​​如,安装在目录中的 JBOSS),则考虑使用相对路径。相对路径将超越重复部署,而资源文件夹会随着每次部署而重新部署。如果文件需要存在于各种容器中,并且应用程序可能安装在不同的目录中,那么执行 DB 应用程序应有的操作,它们有一个指定的 DATA 目录,该目录是绝对的,但可以使用 env-variable 或 system-prop 覆盖。
    • 为此,您需要在目标操作系统上拥有良好的权限才能读取文件。这将取决于您的生产环境的限制。但通常,服务器是由仅对其安装文件夹拥有权限的特定用户设置的,出于安全目的,这些 webApp 不再需要。正如我在回答中所说,如果您想访问位于 webApp 中的文件,请使用 ServletContext 以及谁为您提供 webApp 的真实路径。
    猜你喜欢
    • 2011-08-23
    • 2011-09-29
    • 1970-01-01
    • 2011-01-27
    • 2013-02-21
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多