我想在.jar库中包含一个默认的default.properties文件。我们的想法是允许用户覆盖我的默认值。
我无法让类加载器很好地使用这个设置,我试着看一下流行的jar,比如log4j,common- *等等,似乎没有人实现这个想法。我走错了路吗?
第二个最好的事情是对值进行硬编码,如果没有找到.properties键,则使用默认值,但是这个声音是错误的。
建议?
答案 0 :(得分:1)
我更喜欢将默认值和覆盖保留在单独的文件中。
假设您有一个文件mysettings.properties。我会把它分成两部分。 mysettings-default.properties和mysettings.properties。
默认值应包含在jar文件中并随附。用户可以通过在各种位置提供mysettings.properties来覆盖默认值 - 例如classpath,当前工作目录或user.dir,或通过自定义覆盖-Dsettings.path = / path / to / file。这样,你就有了懒惰的合理默认值,并且在需要时可以非常灵活地覆盖它。
代码非常简单。
就是这样!您有一个具有合理默认值的高度可配置系统。
答案 1 :(得分:0)
我发现你的设计正确而且好。 log4j没有这样做,我总是诅咒他们我需要回忆一下他们的配置语法,并且不能使用一些不错的默认设置(我知道BasicConfigurator,但它太简单了。)
我相信很多网络框架都将他们的默认配置捆绑在他们的罐子里。
您对classloader有什么问题?
答案 2 :(得分:0)
您可以从类路径或文件系统中读取用户配置文件。
文件系统方法是查看配置文件的预定位置(当前目录,/ etc /或其他),如果缺少它,则读取jar中的那个。 您甚至可以包含一个命令来创建默认配置文件(作为文件)。
类路径方法比较棘手,因为您的应用程序无法完全控制它。 我们的想法是,用户需要找到他的配置文件的位置是在类路径中的jar本身之前。
你可以让用户摆弄类路径(这不是一个好主意),也可以使用合适的类路径运送你的jar(清单中的Class-Path条目)。我不确定是否可能,因为我希望清单中的类路径条目被附加到类路径而不是预先填充。
答案 3 :(得分:0)
您可以使用ClassLoader读取jar类路径中的文件。例如,如果您有一个类Test,并且您想要读取与包在同一目录中的文件,则可以使用以下命令:
Test.class.getClassLoader().getResourceAsStream("test_file.txt")
您可以使用标准阅读器解析该输入流:
new BufferedReader(new InputStreamReader( Test.class.getClassLoader().getResourceAsStream("test_file.txt") ))
最后,如果您的文件位于其中一个软件包(com.test)中,则指定路径如下:
new BufferedReader(new InputStreamReader( Test.class.getClassLoader().getResourceAsStream("com/test/test_file.txt") ))