2009-09-14 72 views
0

我有一个Java应用程序,并且log4j.properties文件位于src/com/my/path/props中。在编译的,它被复制到类/ COM /我的/路径/道具如何在用户目录更改时获取文件的文件路径?

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

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

我的问题是:什么是适当的方式来获得一个log4j.properties文件的字符串文件路径表示在我的课/ COM /我的/路径/道具/目录?我意识到如果道具文件在一个罐子里,这将完全崩溃;但在这种情况下,它不是,只是文件系统上的一个文件。 ()。getClassLoader()。getResource(“com/my/path/props/log4j.properties”)。getURI())。getAbsolutePath(),但失败了,因为在生产中,文件的路径实际上是UNC路径,因此会抛出“URI具有权限组件”异常。

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

谢谢。

+1

我很困惑,因为你说该文件被复制到类路径(即在类目录中),但后来你提到“user.dir”。如果您正在从类路径加载文件,那么“user.dir”是无关紧要的。你想从哪里加载文件? – SingleShot 2009-09-14 23:10:05

+0

由于Eclipse的正常编译过程,它被复制到了classes目录中。所以发生在部署时,prop文件位于classes目录中 – 2009-09-14 23:13:09

+0

OK,我会尝试回答... – SingleShot 2009-09-14 23:22:28

回答

0

我拿了singleshot的意见,并保持属性文件了SRC的,而是在我加入到classpath中一个单独的目录。回想起来,这确实是以我最初的方式配置它。

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

的代码最终看上去像这样:同样

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

,感谢所有您的反馈,并指着我下来这让我对答案的路径

1

好的。所以......你问了别人怎么处理这个问题。首先,他们不会将它放在Eclipse中放置文件的位置。他们选择他们想要他们的地方,他们想如何访问他们,然后让他们的构建工具(除非他们只是在玩耍,不应该像Eclipse一样是IDE,而是像Maven或Ant这样的专用构建工具),在哪里放好它。

你想要的文件取决于你想用它做什么的选择。如果它只是一个在运行时永远不会编辑的配置文件,那么通常会将其放置在JAR中(这是另一种做法 - 应用程序放置在一个或多个JAR,WAR或EAR中,而不是类目录中)。如果文件要在运行时进行编辑,从“看”的情况看起来就是这种情况,通常将它放在JAR外部的config目录中。

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

总是选择那里的东西去,你如何访问它们。不要让你的工具为你选择。它将使你的生活更轻松:-)

+0

+1。我猜测OP没有正确使用类路径,因为完全理解了“看” – ChssPly76 2009-09-14 23:42:40

+0

。我应该已经更清楚了:我正在使用classes目录,因为我没有任何理由去其他地方。其他未观看的道具文件居住在那里,我想将所有属性文件放在这个应用程序中,而不是放在classes目录中(我喜欢这个习惯),有些放在不同的道具目录中。 java类中没有办法说“给我一个相对于”me“的文件,其中”me“是类吗?而且这样做完全不好吗? – 2009-09-14 23:45:23

+0

类在类路径上,所以除非你做有些东西很奇怪,你不能访问相对于类的文件,你可以根据类路径的根目录访问它们,如果你的文件位于类路径的目录中,你可以使用上面的类加载器例子访问它(不要使用“user.dir”style)。请注意,它不是相对于你的类 - 你只是简单地使用你的类来获得一个类加载器来访问类路径,这应该工作 – SingleShot 2009-09-14 23:51:59

相关问题