2010-02-09 155 views
9

我期待着做一些我认为不会有困难的事情。Java -jar:访问外部配置文件

我有我想打包作为一个罐子,因为我已经得到了〜30所依赖的应用程序,我希望能够部署一个单独的文件。

我有一些配置文件 - 属性文件和Spring配置文件,我的LOG4道具文件 - 我想有外部的罐子。我猜我认为如果我把它们放在与它运行的jar相同的目录中,但它不会。

在开发,我在classpath的根目录这些文件为我的Eclipse项目和应用程序发现他们就好了。我觉得我缺少的JAR /类路径理论的一些关键方面...

所以我想要的是能够把配置文件和罐子在同一目录下,并有应用程序找到配置文件当我用标准的java -jar运行它时。

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

回答

11

我会为后人保留我解决这个问题。

我认为这是可能的,我期待Java的罐子做一些它不能做的。

如果你使用常规的java命令,你可以在类路径中包括这个jar,你最终会得到与java -jar非常相似的东西,只有你必须专门命名你想要使用的类。它看起来像这样:

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

机会,你要建立一个脚本来启动该程序你啦,所以命令行调用复杂性的增加并没有真正达到多少,因为你”无论如何,只能建立一次。

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

您还会看到我已经展示了如何仍然可以在命令行中提交参数。这是我开始时不确定的事情,但它按预期工作。

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

我希望这可以帮助别人。如果有人能够说“不打扰试图让-jar工作 - 只是使用-cp方法”,它肯定会节省我很多时间...

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需要将log4j.xml配置文件放在类路径中。如果您不使用名称log4j.xml,则还必须将系统属性添加到启动命令中,以告知log4j库查找其他名称。

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

+0

感谢您的回复Jay R 。 我的清单确实有这样的话,我想这是你所建议: 清单-版本:1.0 主类:<我的主类> 类路径: – Joel 2010-02-10 13:17:07

+0

我在我的答案中增加了更多内容,希望能对此有所帮助。 – 2010-02-10 23:16:48

+0

再次感谢您回复Jay R.您的帮助非常感谢。 但是我没有太多的运气。 我正在使用log4j.properties文件而不是xml配置,但我认为只要该文件位于类路径上,log4j应该可以找到它。 与Spring配置文件相同 - 我打电话给我的spring.xml,但只要它在classpath中就不会有任何问题。 我的MANIFEST.MF由Eclipse的“Runnable Jar ...”导出器生成,但看起来与您的示例完全相同。 我不确定这里发生了什么事。再次感谢您的洞察力。 – Joel 2010-02-12 20:47:44

2

我认为你可以在罐子清单为此指定类路径,它应该使用。

编辑:财产以后像This