eclipse 如何从一个可执行的jar文件中读取一个本地属性文件?

jtoj6r0c  于 2022-11-04  发布在  Eclipse
关注(0)|答案(3)|浏览(192)

我在Eclipse靛蓝上开发和测试了我的程序。运行时找到属性文件没有问题。我使用Eclipse导出创建了一个可运行的jar。当程序从jar运行时,程序找不到属性文件。属性文件不在jar中,它在部署jar的目录的子目录中。如上所述,该目录在Eclipse运行配置的类路径中。
我的应用程序/我的应用程序. myApp.properties

props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("myApp.properties"));

我是否只需要编辑Jar清单以将config目录放在类路径上?

qqrboqgw

qqrboqgw1#

properties.load(this.getClass().getResourceAsStream(configFileSrc));

这应该可以。
在我的例子中,configFileSrc =“/apiconfig/appconfig.properties“

我不得不在构建路径中添加staticresourcesdir。
谢谢

uwopmtnx

uwopmtnx2#

是的。请确保指定了config目录相对于jar所在目录的路径。由于您在上面说过config目录是jar位置的子目录,因此这可能只是

<configDir>

其中<configDir>是您的配置目录名称。
您还需要使用绝对资源名称进行查找,方法是在属性文件名中添加一个斜杠:

props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("/myApp.properties"));

这是因为您指定的相对名称将附加类的包路径,而这是您不希望的。
使用contextClassLoader有什么特殊的原因吗?一个更简单的调用是使用包含查找的类的classLoader。而且,由于类可以委托给它的classLoader,你可以简单地说:

props.load(getClass().getResourceAsStream("/myApp.properties"));

最后,您是否考虑过将属性文件放在jar本身中?如果它根本不会改变,这将是一个更好的选择。在这种情况下,您不需要指定classPath。请注意,如果您愿意,您可以将其放在jar* 中的子目录 * 中,但您必须更改您查找的资源路径,并再次使用绝对资源名称
以下是有关绝对和相对资源名称的一些信息:
http://docs.oracle.com/javase/1.5.0/docs/guide/lang/resources.html
希望这对你有帮助!

9rnv2umw

9rnv2umw3#

这里真实的的问题是,您需要决定应用程序将从何处加载属性 * 当部署应用程序时 *。
(How它在Eclipse中工作是一种无关紧要的...除非您期望您的用户安装Eclipse来运行您的应用程序!)

  • 如果您希望它从JAR文件加载属性,则这些属性需要位于JAR文件中。

1.如果您希望它从文件系统加载属性,则它们需要在文件系统中。这意味着您有两个次要问题:
1.您的应用程序将在文件系统中的什么位置运行?请记住,这必须适用于您支持的所有操作系统平台,并且不同的操作系统对于“配置设置”应存储在哪里有不同的约定。
1.是否有 default 版本的属性文件,您将如何安装它?
1.如果您想从CLASSPATH而不是JAR文件加载它,这意味着您不能使您的应用程序成为 * 可执行JAR*。(以java -jar ...运行将忽略所有设置外部类路径的尝试。)
1.如果选择不可执行的JAR文件并从类路径加载属性,则会遇到更多问题:
1.如何设置类路径?
1.如何将属性文件与JAR文件“并排”安装?
1.应用程序类路径上的(潜在的)用户可写目录是否存在安全问题?
这可能是最糟糕的选择。
一旦决定了应用程序在部署时需要如何(从哪里)加载其属性,实现方案的代码就相对简单了。(对上面提到的问题求模。)
您甚至可以合并几个选项;例如,在文件系统中查找属性文件,然后返回到JAR文件中的“default”属性文件。或者,您可以将属性文件的文件系统位置设置为命令行选项,或者通过环境变量或-D和系统属性来提供。

相关问题