配置文件 - 在Java中应该放在哪里?

6

我有一个Java桌面应用程序,配置文件的问题让我很苦恼。

我希望我的可分发应用程序文件夹看起来像这样:

MyApp/Application.jar
MyApp/SpringConfig.xml
MyApp/OtherConfig.xml
MyApp/lib

但是目前,SpringConfig.xmlApplication.jar中,我甚至无法通过程序找到OtherConfig.xml

我不关心如何设置编译路径中的各个文件,只要它们最终看起来像上面那样。

所以,

  • 我应该把文件放在开发环境的哪里?
  • 如何通过编程方式访问它们?

谢谢

3个回答

4
  • Spring配置文件与应用程序的代码和连线有关,因此最好将其放在JAR包中,并且应由用户更改。

  • (new File(".")).getAbsolutePath(); 返回JAR包的绝对路径 - 然后您可以通过简单的FileInputStream加载OtherConfig.xml

  • 如果SpringConfig.xml包含像数据库凭据之类的配置数据,请将它们放在外部的application.properties中,并使用自定义的PropertyPlaceholderConfigurer来加载外部文件。

回答“在我的开发设置中放置文件的位置”这个问题是不可能的,因为我们不知道您的环境。

实际上,如果您想自己编辑配置文件(而不仅仅是最终用户),则可以使用任何zip软件(例如WinRAR)打开jar并从其中编辑配置文件。

更新:似乎您无法使配置文件放在JAR包外面。那么,首先,您可以手动完成 - 每当.jar完成时,只需从内部删除配置文件并将其放置在外部即可。


好的,我正在使用NetBeans。我仍然没有解决这个问题。如果我将文件包含在“config”包中,当我构建时,它们会被卷入一个.jar文件中,这就失去了拥有配置文件的意义!我接受你关于Spring配置的说法 - 我不介意它被编译,但我需要对普通配置文件进行外部访问。这让我疯了... - MalcomTucker
终端用户需要能够编辑您的配置文件吗?还是只有您/您的团队需要编辑?请查看我的更新。 - Bozho
是的,这是必要的 - 我为最终用户提供了一些配置选项,尽管我宁愿他们不需要解压和重新压缩JAR文件,这就是为什么我希望配置文件在根目录中。我只是不知道如何做到!顺便感谢你的建议。 - MalcomTucker
好的,你可以简单地将它从包中移除并放在外面,打包后再按照我上面描述的方式读取它。 - Bozho
好的,但我在NetBeans中找不到任何地方可以将它放置,以便它既可以复制到dist文件夹中,又可以在调试中访问 - 有什么建议吗? - MalcomTucker

2
我通常会创建一个结构,其中我有一个src/目录,然后其他目录存在于同一级别。其中一些目录包括:
  • lib/ - 外部库
  • config/ - 配置文件
  • resources/ - 我使用的各种资源(图像等)
在同一级别上,我创建一个Ant脚本来执行我的构建,以便在构建时将适当的配置文件、资源、lib等复制到我的JAR文件中。它对我来说非常有效,并且是一个相当易于理解的组织结构。 更新:访问我的配置文件通常是通过知道它们的位置并在代码中打开它们并读取它们来完成的。因为我使用Ant来构建,所以我确保我的配置文件位于我期望的位置。因此,例如,在我最近创建的一个应用程序中,当我编译时,我的JAR文件在顶级目录中(相对于应用程序发布结构)。然后,有一个位于同一级别的“main”配置文件。还有一个位于主题文件夹中的“theme”配置文件。
要读取各种文件,我只需像读取任何其他文件一样打开它们并读取它们,然后进行操作。这并不特别花哨,但效果很好,如果需要手动更改配置,这样做也很容易。

@MalcomTucker - 我更新了我的帖子以回答你的问题。 - JasCav
你好,能否提供一段代码片段展示如何读取应用程序相对路径下的配置文件?我猜想你并没有在项目中硬编码这些位置...谢谢。 - MalcomTucker

1
在开发模式下,将它们放在源目录中,它们将被复制到您的类文件夹中,然后您可以使用类加载器访问它们。
例如:
URL url =  ClassLoader.getSystemResource("test.properties");
Properties p = new Properties();
p.load(new FileInputStream(new File(url.getFile())));

在生产模式下,您可以将它们作为您的jar文件的一部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接