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

时间:2009-09-14 22:58:27

标签: java

我有一个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 Service包装器运行此应用程序时,会出现此问题。以这种方式完成后,user.dir会从应用程序的根目录更改为NTService包装程序的exe文件所在的位置。

我的问题是:在我的classes / com / my / path / props /目录中获取log4j.properties文件的String文件路径表示的适当方法是什么?我意识到如果道具文件放在一个罐子里,这将彻底崩溃;但在这种情况下,它不是,而只是文件系统上的文件。

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

行。那么......你问其他人如何处理这个问题。首先,他们不会将文件放在Eclipse上。他们选择他们想要的地方,他们想要如何访问它们,然后使用他们的构建工具(除非他们只是玩游戏,不应该是像Eclipse这样的IDE,而是像Maven或Ant这样的专用构建工具)放置它。

您希望文件的选择取决于您要对其执行的操作。如果它只是一个永远不会在运行时编辑的配置文件,通常将它放在JAR中(这是另一种做法 - 应用程序放在一个或多个JAR,WAR或EAR中,而不是类目录中)。如果要在运行时编辑文件,从“观察”看起来就是这种情况,通常将它放在JAR外的配置目录中。

如何访问它(从文件路径或类路径)是另一种选择。在可能的情况下,我更喜欢从类路径访问文件,因为它更便携 - 而且在JAR中,几乎是必需的。如果在您的情况下没有意义,那么如果在部署时更改,则选择“user.dir”以外的路径。您可以对其进行硬编码,使用环境变量,属性,配置文件,命令行参数等来设置实际路径。

始终选择要去的地方以及如何访问它们。不要让你的工具为你选择。它会让你的生活更轻松: - )

答案 1 :(得分:0)

我采用了singleshot的建议并将属性文件保存在src之外,而是放在我添加到类路径的单独目录中。回想起来,这确实是愚蠢的,因为它按照我原来的方式配置它。

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

代码最终看起来像这样:

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

再次感谢所有人的反馈,并指出了让我走向答案的道路