【问题标题】:Java - Tomcat: Reload context.xml without restarting serverJava - Tomcat:重新加载 context.xml 而不重新启动服务器
【发布时间】:2016-01-28 17:08:03
【问题描述】:

我使用 spring mvc 和 tomcat 作为服务器。我希望能够更改自动装配的 jndi 字段(作为字符串):

<jee:jndi-lookup id="someMessage" jndi-name="someMessage"/>

在我的一项服务中,它引用了 Tomcat 的 conf/context.xml,看起来像这样:

<Environment name="someMessage" value="Change this." type="java.lang.String" />. 

但是,当我更改 context.xml 上的值时,此更改不会反映在我由 spring 管理的服务上,除非我重新启动服务器。有没有办法在不重启或重新部署战争的情况下反映这种变化?我知道有一种解决方案可以在一个属性文件中包含这样一个动态字段,然后使用公共配置库重新加载更改,但我正在寻找一种解决方案来将此字段保留在我的 conf/context.xml 中...

【问题讨论】:

  • 你的 context.xml 是在 webapp 的 META-INF 中还是在 Tomcat 的根目录中?如果它在您的 web 应用程序中,您可以设置可重新加载 - 请参阅“可重新加载”字段下的 the context docs,并且将轮询分解的 WAR 以进行更改。但是,正如文档所说,这非常昂贵。您还可以在虚拟主机级别设置它并仅重新加载该虚拟主机/webapp。
  • 它在Tomcat的根目录上。重新加载它似乎是一种昂贵的方法,即使它是一个解决方案。

标签: java spring tomcat jndi context.xml


【解决方案1】:

我认为这是不可能的。为什么不使用属性文件或静态类?

【讨论】:

  • 负责服务器的人已经知道如何使用 context.xml 并且告诉他们更改其中的属性“更容易”,然后去例如 conf/webapps/不管/WEB-INF(或 META-INF)并查找特定的属性文件以更改那里的值。这是一个敏感信息,所以我不想把它放到一个静态类中并使用它(调用它或任何东西)。但如果没有其他办法,似乎公共配置并将其放在属性文件中是我必须使用的。
【解决方案2】:

据我所知,如果你把它放在你的tomcat家的conf/context.xml中是不可能的,如下面的文档所示:

  • StandardContext.html#reload(): 如果 context.xml 已更改,您应该停止此 Context 并创建(并启动)一个新的 Context 实例。 -- 即无法通过原始上下文实现
  • Reload Existing App: 重新加载现有的 Web 应用程序,以反映 /WEB-INF/classes 或 /WEB-INF/lib 内容的变化。 -- 即不反映context.xml的变化

但是你可以定义你应用的/META-INF/context.xml,它会被打包到war中,你可以在不重启服务器的情况下替换war。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多