Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 避免属性文件路径规范的硬编码_Java_Unix - Fatal编程技术网

Java 避免属性文件路径规范的硬编码

Java 避免属性文件路径规范的硬编码,java,unix,Java,Unix,我遇到了一个小问题,将JAVA程序使用的属性文件的路径规范与实现本身分离。 该程序可能部署在具有不同目录结构的多个位置,我不希望路径规范硬编码到程序代码中 现在的情况是这样的 我有一个文件夹服务器/ 其中有2个包core/&support/(两个包下面都有许多子包) 我之前所做的是,在需要指定属性文件路径的地方,我只给出了一个相对路径,即属性/ 在这种情况下,属性文件需要位于启动程序的任何位置。这在测试期间起作用,当时我正在使用 “java”。我会把属性文件夹放在我启动程序的地方。 但在实际场景

我遇到了一个小问题,将JAVA程序使用的属性文件的路径规范与实现本身分离。 该程序可能部署在具有不同目录结构的多个位置,我不希望路径规范硬编码到程序代码中

现在的情况是这样的

我有一个文件夹服务器/ 其中有2个包core/&support/(两个包下面都有许多子包)

我之前所做的是,在需要指定属性文件路径的地方,我只给出了一个相对路径,即属性/ 在这种情况下,属性文件需要位于启动程序的任何位置。这在测试期间起作用,当时我正在使用 “java”。我会把属性文件夹放在我启动程序的地方。 但在实际场景中,该程序将由一个脚本(ksh)自动启动,该脚本由作业按预定间隔执行

在这种情况下,给出相对路径不起作用。我尝试将属性文件放在脚本所在的文件夹中,但这也不起作用

现在,我必须手动指定每个环境的路径,重新编译代码并为每个环境部署单独的副本。
是否有任何方法可以移除此耦合,并且无论需要将属性文件部署到何处,属性文件都只有一个位置?

使用System.properties条目指定路径,然后在命令行上通过

java -DmyProp=somepath -cp yourclasspath YourClass
在您的应用程序中,您可以使用
System.getProperty(“myProp”)
检索它,只需确保添加适当的测试并处理未找到属性的情况


另一种做法是将道具放在jar中,然后用LoadResource加载它们,这样,您只需要在每次部署中部署不同的配置jar,但我认为System.setProperty方式是最快的。

一般来说,一些客户端在启动应用程序时可能不喜欢使用-D=。事实上,您还应该在jar文件中提供一个.sh/.bat脚本文件,以便客户端只需双击脚本即可运行应用程序

在这个脚本中,您可以声明变量,您可以要求客户机相应地进行配置。客户端只需在文本编辑器中打开脚本文件并键入配置文件的路径

使用此脚本文件的其他方法是执行以下操作: 1) 检查是否在系统环境中设置了_APP_NAME_CONFIG变量。如果是,则转至步骤3或转至步骤2 2) 在命令行上询问用户配置文件的位置。检查位置是否正确。如果正确,则使用配置文件的位置值设置环境变量YOUR_APP_NAME_CONFIG。 3) 启动您的应用程序

拥有应用程序的脚本文件可以让您在自动化应用程序的环境配置方面有更多的自由。 在应用程序中,通过System.getProperty(“您的应用程序名称\配置”)获取配置文件路径


这一切看起来很痛苦,但要从客户的角度考虑。客户端只需双击一个脚本即可启动应用程序,对于第一次启动应用程序,如果需要,脚本会请求一些输入,然后应用程序就可以运行了:)

我所做的是通过jar调用传递另一个类路径参数

java-cp类路径1;propertiesfile所在的文件夹Application.jar

在应用程序中使用
getClass().getClassLoader().getResourcesStream(“属性文件”)

这将自动从相应的类路径文件夹中获取属性文件


通过此设置,我可以更改文件夹中的属性文件,并使用相同的jar文件,而无需重新归档jar。

非常感谢,这帮助我消除了项目中的最后一个瓶颈:)