Java -jar:访问外部配置文件
我正在寻找一些我认为不会有困难的事情。
我有一个应用程序,我想打包成jar,因为我有~30个依赖项,我希望能够部署一个文件。
我有一些配置文件 – 属性文件和弹簧配置文件,以及我的log4道具文件 – 我想在jar外部。 我想我希望如果我将它们放在与jar相同的目录中,它会在运行时找到它们,但事实并非如此。
在开发的过程中,我将这些文件放在我的eclipse项目的类路径的根目录下,应用程序发现它们就好了。 我觉得我错过了jar / classpath理论的一些关键方面……
所以我想要的是能够将配置文件和jar放在同一目录中,并让我的应用程序找到配置文件时,我用标准的java -jar运行它。
有没有一种简单的方法来实现这一目标?
我会为后人保留我对这个问题的解决方案。
我认为我可能期望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方法”,那肯定会节省我很多时间……
你需要添加“。” 到您为应用程序构建的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根本不使用类路径机制。 在这种情况下,您需要知道应用程序期望文件相对于当前工作目录的位置。
- 了解Eclipse类路径声明
- 如何解决此错误引起:java.lang.ClassNotFoundException
- GlassFish服务器收到消息时出现java.lang.NoClassDefFoundError错误
- 如何在Java中配置.dll文件?
- Class.getResourceAsStream的解释以及如何在Tomcat中为简单的Java Web应用程序设置它?
- 是否可以在javac(JDK 9)中混合使用–class-path和–module-path?
- 不属于classpath的dependecies的测试资源?
- java.lang.ClassNotFoundException / NoClassDefFoundError for com / fasterxml / jackson / databind / ObjectMapper with Maven
- 可以在运行时将目录添加到类路径吗?