[英]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.