java -D參數設置系統屬性無效問題及解決

java -D參數設置系統屬性無效

我們都知道如何在Java中獲取系統屬性:

System.getProperty(ESClientConstance.HTTP_PROXY_HOST);

這樣可以獲取操作系統默認的一些屬性值。

如果我們需要自定義一些系統屬性,那麼這樣定義:

-Dhttp_proxy_host=192.19.19.19

但是要註意下面這種情況,會導致java -D失效,進而導致System.getProperty獲取不到屬性值。

比如我的這樣一個以java -jar方式啟動的腳本:

nohup java -agentlib:jdwp=transport=dt_socket,address=39502,server=y,suspend=n \
-jar /opt/spider-es-cli/es-client-1.0.0.jar \
-Dhttp_proxy_host=100.129.18.11 \
-Dhttp_proxy_port=3128 \
--spring.profiles.active=prod \
--server.port=9502 >/dev/null 2>&1 &

註意-D錯誤地配置在瞭-jar之後。

處理方式是將-D正確地配置在-jar之前即可。

同樣地,對java 類名方式啟動也一樣,註意要將-D配置在類名之前。

java程序啟動參數 -D詳解

java程序啟動參數 -D是用來做什麼的呢?

去查詢瞭一下官方解釋:

Set a system property value. If value is a string that contains spaces, you must enclose the string in double quotes:

java -Dfoo="some string" SomeClass

也就是說-D是用來在啟動一個java程序時設置系統屬性值的。如果該值是一個字符串且包含空格,那麼需要包在一對雙引號中。

何為系統屬性值呢?也就是在System類中通過getProperties()得到的一串系統屬性。

下面我們來寫個測試方法就知道瞭

/**
 * @author lmfeng
 * @date 2018/05/30
 */
public class SystemProperty {
 
    public static void main(String[] args){
        System.out.print(System.getProperty("dubbo.token"));
    }
}

在運行改程序時加上JVM參數-Ddubbo.token=“666” 或者 -Ddubbo.token=666,那麼運行之後你可以看到控制臺輸出瞭666!

一點值得註意的是,需要設置的是JVM參數而不是program參數,註意看下圖

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: