我一直在努力解决一个特定的问题。我在 .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 中的一大堆第 3 方 jar)
如何在清单文件中正确设置类路径以便可以引用配置?
我的清单中的类路径如下所示:Class-Path: 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 化时工作,又能在非 jar 化时工作,例如当我在 Eclipse 中以调试模式运行时。此时,config 目录是src
, bin
, and lib
目录。
编辑第 2 部分:好的,在我和一位同事之间,我们提出了以下建议:
String configDirectory = new File(QueueMonitor.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getParent() + "/config";
当我们在 Eclipse 中并以调试模式运行时,File 对象指向bin
目录,因此获取父目录然后附加“/config”可以满足我们在开发/测试期间的需求。
同样,从 .jar 文件中,File 对象指向 jar 本身,因此获取父级并附加“/config”也可以满足我们的需要。
不过我有点犹豫。我想知道是否存在一些我在该解决方案中没有看到的潜在问题或意外后果。对此有什么想法吗?