在 .war 之外引用 configuration.properties

Posted

技术标签:

【中文标题】在 .war 之外引用 configuration.properties【英文标题】:referencing configuration.properties outside of the .war 【发布时间】:2011-06-20 13:26:38 【问题描述】:

我想部署一个战争,战争应该从战争之外获取一些属性(让我们说 .war 文件在哪里,同一个目录。)

目前这是我找到的最佳解决方案:

<context:property-placeholder location="file:$user.home/configuration.properties" ignore-unresolvable="true"/>

但是这个解决方案迫使我将其始终保留在主目录中。我希望它位于我部署 .war 的 tomcat webapps 目录中。我只是在寻找涉及绝对路径的解决方案。如果相对路径绝对不可能,那么我会考虑使用绝对路径。

提前致谢。

【问题讨论】:

您写道:“我只是在寻找涉及绝对路径的解决方案”,但我猜您的意思正好相反。 不,我没有。看看你使用的路径,它不是绝对的。 user.home 类型的变量可以是任何类型。 请问为什么您希望您的配置在网络应用程序上下文之外?是因为您想与其他网络应用程序共享配置吗?如果是这样,那么有更好的方法来做到这一点。 让用户可以方便的把数据库服务器的详细信息放上去 【参考方案1】:

这是一种解决方案:

<context:property-placeholder 
     location="file:$catalina.home/webapps/datasource.properties"
     ignore-unresolvable="true"/>

如果有什么更好的,请告诉我,例如,如果我可以摆脱 catalina 家庭参考并以某种方式使其成为更通用的参考。

【讨论】:

我认为这是最好的方法,但它让我选择的 IDE intellij ***.com/q/13606328/106261【参考方案2】:

我可以提供的一种解决方案是使用系统属性将路径传递给配置文件。

有2个级别的属性:

java 系统属性使用 switch -D 发送到 JVM 并由System.getProperty() 提取 您在操作系统级别定义并可以使用System.getenv() 访问的操作系统环境变量

【讨论】:

感谢 AlexR,但请查看我在不涉及 java 的情况下编写的可能解决方案之一。我会很乐意使用 jndi,使用 java 代码将是最后一件事。【参考方案3】:

这个聚会有点晚了,但我想我会发布一个答案,因为这个问题首先出现在 Google 上。我不确定这在提出问题时是否有效,但从 Spring 3.1 开始,您可以这样做以使用绝对路径:

<context:property-placeholder location="file:///etc/myApp/myApp.conf"/>

请注意,有三个正斜杠。前两个用于协议:“file://”。

【讨论】:

【参考方案4】:

第 1 步:定义属性:

&lt;util:properties id="myProperties" location="file:some/Absolute/path" /&gt;

第 2 步:在您的应用程序中使用它。示例:

(1)public ModelAndView doWhatever(@Value("#myProperties['some.outside.property']") String whatever) ...

或 (2) Properties props = appContext.getBean("myProperties", Properties.class);

【讨论】:

【参考方案5】:

您可以将属性文件放在类路径中,只需指定属性文件名。 通过java代码可以做到like this

我猜想 spring 也应该检查类路径中的属性文件。 您可以尝试将属性文件放在类路径中并仅提及文件名。

【讨论】:

感谢您的评论。目的是不使用我们已经在使用 spring 的代码,下一步应该是最小的。【参考方案6】:

您可以在 Tomcat 的context.xml 中定义任何变量作为上下文参数,并在放置在 war 中的 applicationContext.xml 中使用它。

例如context.xml:

<Context>
    <Parameter name="configlocation" value="/etc/application/my.properties" override="false"/>
</Context>

applicationContext.xml:

<beans ...>
   <context:property-placeholder location="file:$configlocation" ... />
</beans>

【讨论】:

以上是关于在 .war 之外引用 configuration.properties的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EAR 或 WAR 之外存储 Java EE 配置参数?

Undertow:WAR 文件之外的静态根内容(wildfly)

使用spring boot loader WarLauncher时如何在war文件之外加载属性文件?

这是将 .properties 文件排除在 WAR 文件之外的最佳方法吗?

Configuration Error: deployment source 'xxx:war exploded' is not valid

Configuration Error: deployment source 'xxx:war exploded' is not valid