当我从另一个位置调用程序时,不会加载Java属性

当我从另一个位置调用程序时,不会加载Java属性,java,Java,我有一个程序,其中属性文件的路径与我要运行的程序的路径相同 属性文件名在程序开始时初始化为: public static final String DEFAULT_PROPERTIES_FILE = "defaultProperties.properties"; 当程序在其自身所在的目录中运行时,程序运行良好: java -jar program.jar 从另一个目录运行程序时,使用: java -jar path/program.jar 程序将找不到属性文件并返回: java.io.F

我有一个程序,其中属性文件的路径与我要运行的程序的路径相同

属性文件名在程序开始时初始化为:

public static final String DEFAULT_PROPERTIES_FILE = "defaultProperties.properties"; 
当程序在其自身所在的目录中运行时,程序运行良好:

java -jar program.jar
从另一个目录运行程序时,使用:

java -jar path/program.jar
程序将找不到属性文件并返回:

java.io.FileNotFoundException:defaultProperties.properties(没有这样的文件或目录)

固定的 我想出了一个解决办法。可以调用类的路径并给出配置文件的路径

StringBuilder stringBuilder = new StringBuilder( PolicyBoosterTool.class.getProtectionDomain().getCodeSource().getLocation().getPath() );
String pathToFolderOfJarFile = stringBuilder.substring( 0, stringBuilder.lastIndexOf( "/" ) + 1);

DEFAULT_PROPERTIES_FILE =  pathToFolderOfJarFile + "defaultProperties.properties";

遗憾的是,我自己无法将这件事标记为已解决。对此的任何改进都是受欢迎的。谢谢大家的帮助

必须指定属性文件的完整路径。如果您不指定路径,那么它将尝试在启动jar的同一目录中查找文件。因此
FileNotFoundException


一个简单的解决方案是-将属性文件的路径定义为命令行参数。

将属性文件保留在任意位置并使应用程序读取它的一种方法是使用VM参数

例如:

传递一个VM参数,比如
prop.path

java -Dprop.path=path/to/your/properties/file -jar path/program.jar
然后你就可以读了

System.getProperty("prop.path")

希望这有帮助。

将属性文件的父文件夹放在类路径中。您如何读取该文件?除非您有不同的指定,否则它将在jar运行的当前路径中查找。请发布您用于读取文件的代码,以及您收到的异常的完整堆栈跟踪。可能重复@Nikem我发布了我希望是代码的所有关键部分和完整堆栈跟踪。这有用吗?谢谢:)啊,如果程序被移动,我也希望能够从不同的位置运行:)如果可能的话,我希望避免让其他人键入他们想要运行程序的整个路径。但如果无法实现自动化,我会选择这样做。非常感谢。如果您的属性文件是随机路径,那么您需要有一种方法来提供jar的路径。您可以创建一个自定义配置类,以从一组固定的路径获取属性文件。基本上你必须选择微服务架构。这听起来正是我需要的!我会努力查看它是如何完成的,尽管欢迎所有建议^ ^谢谢,如果只有我,这将是一个伟大的解决方案。我正在寻找一种方法,其他人可以用最小的努力做同样的事情。避免在-jar path/program.jar之前键入所有java-Dprop.path=path/to/your/properties/file。不过,答案确实很有帮助,我投了更高的票。我希望我会有足够的因果报应时间让upvote显示^ ^@Turbojumala如果你想外部化你的属性文件,那么你必须为你的程序提供一种获得该路径的方法。请始终将属性文件放在类路径中的文件夹中,或者专门将路径传递给您的程序。谢谢!是的,我找到了解决办法。属性文件当然必须位于路径中,但我希望能够从路径之外运行程序,而无需指定属性文件的位置。我现在把我的答案放在问题的末尾。如果你认为有更好的方法来解决这个问题,我很高兴听到:)我觉得我的顶多也没问题:d谢谢你的帮助!:)