2017-09-01 39 views
0

我們所有的罐子都包含一個特定的文件version.properties,其中包含來自版本的特定信息。在同一個罐子中訪問屬性文件

當我們從命令行啓動一個罐子(在類路徑上有幾個罐子)時,我們想從獲得version.properties罐子的相同。更確切地說:我們希望編寫Java代碼,它將調用類文件所在的jar文件中的屬性文件的內容提供給我們。

問題是類路徑上的所有jar包含version.properties,我們不想讀取類路徑中的第一個,但是從正確的jar中讀取第一個。我們如何實現這一目標?

+0

Java使用包有很好的理由。爲什麼不在適當的包中設置version.properties? –

+0

version.properties位於每個jar的主目錄中 - 這是不能更改的(公司標準) –

+0

您將無法使用類加載器來執行此操作。相反,你必須使用骯髒的技巧來找出類來自哪裏(如果有的話),然後打開一個jar輸入流到該jar並查找version.properties條目,然後閱讀此條目。或者你可以改變公司的標準,使其成爲可用的標準。 –

回答

1

有趣的問題。您必須找到特定jar的代表類的位置,並使用結果來構建屬性文件的URL。我被黑一起使用String.class如在META-INF示例和訪問MANIFEST.MF的例子中,由於rt.jar中中沒有任何屬性(至少一個快速jar tf rt.jar | grep properties導致零個結果)

Class clazz = String.class; 
    String name = clazz.getName().replace('.', '/') + ".class"; 
    System.out.println(name); 
    String loc = clazz.getClassLoader().getResource(name).toString(); 
    System.out.println(loc); 
    if (loc.startsWith("jar:file")) { 
     String propertyResource = loc.substring(0, loc.indexOf('!')) + "!" + "/META-INF/MANIFEST.MF"; 
     InputStream is = new URL(propertyResource).openStream(); 
     System.out.println(propertyResource); 
     Properties props = new Properties(); 
     props.load(is); 
     System.out.println(props.get("Implementation-Title")); 
    } 
相關問題