Java -jar:访问外部配置文件

时间:2010-02-09 21:17:21

标签: java configuration jar classpath external

我正在寻找一些我认为不会有困难的事情。

我有一个应用程序,我想打包成jar,因为我有~30个依赖项,我希望能部署一个文件。

我有一些配置文件 - 属性文件和弹簧配置文件,以及我的log4道具文件 - 我希望在jar外部。我想我希望如果我将它们放在与jar相同的目录中,它会在运行时找到它们,但事实并非如此。

在开发时,我将这些文件放在我的eclipse项目的类路径的根目录下,应用程序发现它们就好了。我觉得我错过了jar / classpath理论的一些关键方面......

所以我想要的是能够将配置文件和jar放在同一个目录中,让app在我用标准的java -jar运行它时找到配置文件。

有没有一种简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:11)

我会为子孙后代解决这个问题。

我认为我可能希望java -jar做一些它不做的事情。

如果你使用常规java命令,你可以在类路径中包含jar,你最终会得到与java -jar几乎相同的东西,只需要专门命名你想要使用的类。它看起来像这样:

java -cp .:path/to/Jar.jar com.company.package.Class arg1=val1 arg2=val2 ....

你有可能会为你创建一个脚本来启动程序,所以命令行调用的额外复杂性实际上并不多,因为你只会构建它一次。

你会看到我包括'。'作为类路径中的第一项,这意味着与jar相同的目录中的任何内容也将包含在类路径中。当然,jar中的所有内容都包含在类路径中,因为jar本身也在类路径中。

您还会看到我已经展示了如何在命令行中输入args。这是我在开始时不确定的事情,但它按预期工作。

我确信这只是基本的Java部署知识,但由于某种原因我缺乏它。

我希望这有助于其他人。如果有人能够说“不要试图让-jar工作 - 只需使用-cp方法”,那肯定会节省我很多时间......

答案 1 :(得分:4)

您需要添加“。”到您为应用程序构建的jar文件的类路径。

所以在清单中,我希望看到

Main-Class: some.full.Name
Class-Path: . needed-lib.jar other-lib.jar 

然后,当您通过执行

运行您的应用程序时
java -jar myapp.jar

它实际上使用

java -classpath .;needed-lib.jar;other-lib.jar some.full.Name

这样,带有myapp.jar文件的目录中的任何文件也将位于类路径中。该类路径相对于包含它的jar的位置。

Log4j for one期望log4j.xml配置文件位于类路径上。如果您没有使用名称log4j.xml,还必须在启动命令中添加系统属性,以告诉log4j库查找其他名称。

我不确定Spring对配置文件的期望。属性文件加载取决于用于加载文件的机制。使用FileReader或InputStream根本不使用类路径机制。在这种情况下,您需要知道应用程序期望文件相对于当前工作目录的位置。