代码之家  ›  专栏  ›  技术社区  ›  marc esher

当用户目录更改时,如何获取文件的文件路径?

  •  0
  • marc esher  · 技术社区  · 16 年前

    我有一个java应用程序,log4j.properties文件位于src/com/my/path/props中。编译时,它被复制到classes/com/my/path/props中

    该文件通过PropertyConfigurator.configureAndWatch(user.dir+“/classes/com/my/path/props/log4j.properties”)加载。

    虽然由于使用user.dir(但我不知道相对于“应用程序的开始目录”引用文件的另一种方法),所以这一切正常工作,但并不理想。当尝试使用NT服务包装器运行此应用程序时,问题就会显现出来。这样做后,user.dir将从应用程序的根目录更改为NTService包装器的exe文件所在的位置。

    我尝试了新文件(this.getClass().getClassLoader().getResource(“com/my/path/props/log4j.properties”).getURI()).getAbsolutePath(),但失败了,因为在生产环境中,文件的路径实际上是UNC路径,因此引发了“URI具有权限组件”异常。

    其他人如何处理这个问题?

    谢谢

    2 回复  |  直到 16 年前
        1
  •  1
  •   SingleShot    16 年前

    好啊所以你问其他人如何处理这个问题。首先,他们不会让Eclipse决定文件的放置位置。他们选择需要它们的地方、访问它们的方式,然后将构建工具(除非他们只是在玩,否则不应该是像Eclipse这样的IDE,而是像Maven或Ant这样的专用构建工具)放在哪里。

    文件存放位置的选择取决于您要对其执行的操作。如果它只是一个在运行时永远不会被编辑的配置文件,您通常会将其放在JAR中(这是另一种做法——应用程序放在一个或多个JAR、WAR或EAR中,而不是类目录中)。如果文件要在运行时进行编辑(从您的“观察”来看似乎是这样),则通常将其放在JAR外部的配置目录中。

    始终选择事物的去向和访问方式。不要让你的工具为你选择。这会让你的生活更轻松:-)

        2
  •  0
  •   marc esher    16 年前

    我接受了singleshot的建议,将属性文件保存在src之外的一个单独的目录中,并将其添加到类路径中。回想起来,这确实是愚蠢的,因为我已经按照最初的方式配置了它。

    从那里,我的问题是从URL获取文件。我最终在Commons IO FileUtils中找到了我所需要的东西,以及它的 toFile(URL) 方法

    代码最终是这样的:

    private URL maintenanceConfigPath = this.getClass().getClassLoader().getResource("MaintenanceConfig.properties");
    ....
    File f = FileUtils.toFile(maintenanceConfigPath);
    ....
    

    再次感谢大家的反馈,感谢你们为我指出了一条通向答案的道路