Java 在jar之外使用config启动.jar,但可以从任何当前目录执行此操作

Java 在jar之外使用config启动.jar,但可以从任何当前目录执行此操作,java,jar,config,Java,Jar,Config,我一直在努力解决一个特殊的问题。我在.jar文件中有一个Java程序,在.jar之外有一个lib目录和一个config目录,但与jar本身所在的目录相同 我试图从代码中引用config/foo.config。如果我与jar位于同一目录中,则将其作为相对文件引用是有效的。我还尝试使用getResourceAsStream并确保配置位于类路径中 到目前为止,还不错,但我还必须能够从任何目录启动.jar 如果我的结构是这样的: /prog/util/myprog/myprog.jar /prog/ut

我一直在努力解决一个特殊的问题。我在.jar文件中有一个Java程序,在.jar之外有一个lib目录和一个config目录,但与jar本身所在的目录相同

我试图从代码中引用
config/foo.config
。如果我与jar位于同一目录中,则将其作为相对文件引用是有效的。我还尝试使用getResourceAsStream并确保配置位于类路径中

到目前为止,还不错,但我还必须能够从任何目录启动.jar

如果我的结构是这样的:

/prog/util/myprog/myprog.jar
/prog/util/myprog/config
/prog/util/myprog/config/foo.config
/prog/util/myprog/lib
(还有lib中的一大堆第三方jar)

如何在清单文件中正确设置类路径,以便可以引用配置

清单中的类路径如下所示:
类路径:config/lib/jar1.jar lib/jar2.jar
(etc)

我目前正在使用
getResourceAsStream(“/foo.config”)

如果我在/prog/util/myprog目录中并运行以下命令,则所有这些都可以工作:

java -jar myproj.jar
但是,我不能,比如说,在/prog中运行:

java -jar util/myprog/myprog.jar
执行此操作时,无法找到配置文件

我如何解决这个问题

编辑:根据评论/建议添加一些注释,但我不确定这是否可行:

1) 我们不能为文件系统使用绝对路径,我们不知道程序将存储在哪里,只知道config目录将与jar位于同一目录中

2) 我希望能够在代码是jar'd的情况下工作,但在Eclipse中以调试模式运行时也可以不使用jar'd。此时,config目录是
src
bin
lib
目录的同级目录

编辑第2部分:好的,在一位同事和我之间,我们得出以下结论: 字符串configDirectory=新文件(QueueMonitor.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getParent()+“/config”

当我们在Eclipse中并在调试模式下运行时,File对象指向
bin
目录,因此在开发/测试期间,获取父级然后附加“/config”可以满足我们的需要

类似地,从.jar文件中,file对象指向jar本身,因此获取父对象并附加“/config”也为我们提供了所需的内容


不过我有点犹豫。我想知道在这个解决方案中是否存在一些我没有看到的潜在问题或意外后果。对此有何想法?

您应该能够使用该技术找到您的罐子的位置。从这里开始,您只需爬进/爬出文件夹。

您可以将文件放在一个众所周知的位置,如用户主目录或应用程序配置目录(抱歉,不熟悉nix约定)。不幸的是,我们无法使用该选项。jar将在某个地方,但可能会被更改,因此我们不需要为文件系统使用绝对路径。