如何在运行时更改Java属性?

16

问题: 有没有一种方法可以“连接”到正在运行的JVM并更改系统属性(通过-Dproperty=value给出),而不停止JVM并且没有编程实现这样做的方式?

现在,背景是这样的: 我在远程机器上运行着一个JBoss服务器,它托管了我的应用程序以及其他应用程序。 这些其他应用程序可能不能停止。 该服务器使用特定的-D属性调用,该属性仅与我的应用程序相关。 在服务器启动时,此属性被分配了错误的值。 我需要更改该属性。 最简单的方法是重新启动JBoss,但这会导致所有应用程序都停机一段时间。 有没有一种方法可以在不停止任何应用程序的情况下更改该属性,仅限于我自己的应用程序?

谢谢!


1
你考虑过使用java.util.prefs.Preferences吗?http://download.oracle.com/javase/1.4.2/docs/guide/lang/preferences.html - Koekiebox
4
在部署前充分测试的重要性,有一个很好的例子。 - OrangeDog
5个回答

5

我在我的代码中找到了一个例子:

System.setProperty("javax.net.ssl.trustStore", keystore_file); 

您可以在服务器代码中添加reconfigure()来响应“重新配置”查询。

4

许多系统属性只在启动时检查,因此更改它们并不总是有帮助的。

我建议您在应用程序中添加支持,通过请求执行更改,以便您的应用程序知道已发生更改,并相应地处理它。


如果我成功地更改了属性,然后通过 JBoss 的管理控制台重新启动应用程序,那么应用程序应该会再次读取它,对吧? - Bruno Teixeira
1
@Bruno Teixeira,如果您更改属性并重新启动JBoss,则会从任何地方获取它并将其拾取。如果您在运行时更改它,则不会保存属性。我建议您尝试在运行时更改属性,看看它是否符合您的预期。这完全取决于属性是什么以及哪个库使用它。 - Peter Lawrey

1

正如其他人已经建议的那样,可能无法更改应用程序使用的系统属性值。一种选择可能是重新启动您的应用程序。似乎Jboss为Web应用程序提供了启用JMX停止/启动功能,您可以在这里阅读,尽管我实际上还没有尝试过。


1
这不是一个长期的解决方案,但是您可以连接调试器并热交换一些代码,以返回您想要的属性值,而不是查找该属性。不过,这需要在启动JBoss时启用远程调试。

0

你可以使用System.setProperty()方法来实现。 例如:System.setProperty(key, value);


7
我相信OP想要从_JVM之外_改变该属性。 - Eli Acherkan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接