簡體   English   中英

我們可以在 java 的屬性文件中使用 unix 變量嗎

[英]can we use unix variables in our property file in java

在 java 應用程序中,我的屬性文件具有鍵/對值,例如

usa.national.bank=美國銀行

等等

現在假設我將我的應用程序部署在 unix 框中,其中我已經聲明了如下變量:export US_NAT_BANK=Bank of America

所以我的應用程序應該在這個 unix 框中運行,並且在運行時的某個時刻,它會讀取這個值。

所以嘗試像這樣聲明我的屬性文件:usa.national.bank=$US_NAT_BANK

但它無法讀取變量中定義的值,即“美國銀行”,而是讀取文字值,即“$US_NAT_BANK”

我做錯了什么還是不能在屬性文件中使用 unix 變量?

Java 具有 API 以使用ProcessBuilder與系統命令進行交互。

您可以使用以下解決方案使用 java 讀取 UNIX 屬性:

ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", "echo $US_NAT_BANK");
    final Process process = processBuilder.start();
    try (InputStream is = process.getInputStream()) {
        byte[] result = is.readAllBytes();
        System.out.println(new String(result, UTF_8));
    }

使用ProcessBuilder ,您可以執行任何 UNIX 支持的命令,並獲得與控制台/終端相同的結果。

您可以了解更多詳情: ProcessBuilder JavaDoc

我有一個 class ,它擴展來自相同 map、系統屬性或 ENV 的變量(如果它們的格式${lookupname} 很容易適應屬性:

public class PropLookup
{
    private Pattern pattern = Pattern.compile("\\$\\{([A-Za-z][A-Za-z_\\.]*)\\}");
    private Map<String, String> map;
    public PropLookup(Map<String,String> map)
    {
        this.map = map;
    }

    public static void main(String[] args)
    {
        Map<String,String> map = Map.of(
                "usa.national.bank", "${US_NAT_BANK}"
                ,"bank", "Barclays"
                ,"message1", "You are using JDK ${java.version}"
                ,"message2", "Your PATH is ${PATH}"
                ,"another", "${bank} is at ${address}");

        PropLookup p = new PropLookup(map);

        for (String k : map.keySet())
        {
            System.out.println(k+"="+p.expandKey(k));
        }
    }

    public String expandKey(String k)
    {
        return expandValue(this::lookup, this.lookup(k));
    }

    private String lookup(String var)
    {
        String v = map.get(var);
        if (v == null)
        {
            v = System.getProperty(var);
        }
        if (v == null)
        {
            v = System.getenv(var);
        }
        if (v == null)
        {
            v = "[NOT DEFINED:"+var+"]";
            // OR: throw new IllegalArgumentException("Not found the env or property value: "+var);
        }
        return v;
    }

    private String
    expandValue(Function<String,String> lookup, String s)
    {
        final Matcher m = pattern.matcher(s);

        StringBuilder b = null;
        int last = 0;

        while (m.find())
        {
            String var = m.group(1);

            if (b == null)
                b = new StringBuilder(256);

            b.append(s.substring(last, m.start()));

            String value = lookup.apply(var);
            if (value != null)
            {
                b.append(value);
            }
            else // add whatever we tried to lookup
            {
                b.append(m.group());
            }

            last = m.end();
        }

        if (last != 0)
        {
            b.append(s.substring(last));
            s = b.toString();
        }

        return s;
    }
}

注意:這不會將搜索擴展到一個以上的級別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM