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


问题是: 是否有某种方法可以“连接”到正在运行的JVM并更改系统属性(由-Dproperty = value给出)而无需停止JVM并且没有编写方法来执行此操作?

现在,上下文: 我有一台运行在远程机器上的JBoss服务器,它托管我的应用程序,还有其他应用程序。其他应用程序可能无法停止。使用与我的应用程序相关的特定-D属性调用服务器。在服务器启动时为此属性分配了错误的值。我需要改变那个属性。最简单的方法是重启JBoss,但这会导致所有应用程序停机一段时间。有没有办法改变这个属性而不停止任何应用程序,但我自己的?

谢谢!


15
2017-12-17 10:52


起源


你考虑过使用java.util.prefs.Preferences吗? download.oracle.com/javase/1.4.2/docs/guide/lang/... - Koekiebox
在部署之前应该对事物进行适当测试的一个很好的例子。 - OrangeDog


答案:


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

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

您可以运行它来响应“重新配置”查询(添加 reconfigure() 到您的服务器代码)。


4
2017-12-17 11:00





许多系统属性仅在启动时进行检查,因此更改它们并不总是有用。

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


3
2017-12-17 11:08



好吧,如果我设法更改道具,然后通过JBoss的管理控制台重新启动应用程序,应用程序应该再次读取它,对吧? - Bruno Teixeira
@Bruno Teixeira,如果你从JBoss获得它的地方更改属性并重新启动它将获取它。如果在运行时更改它,则不会保存属性。我建议你只是尝试在运行时更改属性,看看它是否符合你的预期。这一切都取决于属性是什么以及哪个库使用它。 - Peter Lawrey


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


1
2017-12-17 11:32





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


1
2017-12-17 11:34





你可以使用System.setProperty()方法来做到这一点。 例如:System.setProperty(key,value);


0
2017-12-17 10:55



我相信OP希望改变房产 外 JVM。 - Eli Acherkan