2011-01-14 70 views
3

我有一個包含一個svnversion.properties文件(只是看起來像svnversion=12345M或其他)和下面的靜態方法在class SVNVersionfoo.jar的java:獲得正確的資源

public static SVNVersion fromString(String s) { ... } 
public static SVNVersion fromResources(Class<?> cl) { 
    ResourceBundle svnversionResource = ResourceBundle.getBundle(
     "svnversion", Locale.getDefault(), cl.getClassLoader()); 
    if (svnversionResource.containsKey("svnversion")) 
    { 
     String svnv = svnversionResource.getString("svnversion"); 
     return fromString(svnv); 
    } 
    else 
    { 
     return null; 
    } 
} 

我也有一個圖書館bar.jar那還包含一個svnversion.properties文件(假設它包含svnversion=789)。

然而,當我運行一個class SomeClassInBarJar這是在bar.jar中的以下:

SVNVersion vfoo = SVNVersion.fromResources(SVNVersion.class); 
SVNVersion vbar = SVNVersion.fromResources(SomeClassInBarJar.class); 

我打印結果,我看到789兩次。很明顯,我沒有這樣做。如何在包含給定類的jar文件的根目錄中獲取正確的svnversion.properties文件? (假設它的存在)


編輯:我只是想

InputStream is = cl.getResourceAsStream("/svnversion.properties"); 

,它有同樣的問題。我似乎只能訪問主jar文件的/svnversion.properties而不是庫的/svnversion.properties

+1

給不同的類名並不一定意味着不同的類加載器。我不認爲這是可能的,這樣做 – 2011-01-14 18:27:09

+0

@Teja:我明白了。 :-)我對如何正確地做它感興趣。 – 2011-01-14 18:28:47

回答

2

你顯然不能使用這種方法,因爲無論svnversion.properties文件是否總會用到類加載器。這與您將看到的類相同:如果具有相同名稱的兩個類位於類路徑中,則無論先使用哪個類。

A(曲)的方法是找出罐子類屬,然後在罐子檢索svnversion.properties

public static JarFile getJarFile(Class<?> cl) { 
    URL classUrl = cl.getResource(cl.getSimpleName() + ".class"); 
    if (classUrl != null) { 
     try { 
      URLConnection conn = classUrl.openConnection(); 
      if (conn instanceof JarURLConnection) { 
       JarURLConnection connection = (JarURLConnection) conn; 
       return connection.getJarFile(); 
      } 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
    return null; 
} 

public static SVNVersion fromResources(Class<?> cl) { 
    JarFile jarFile = getJarFile(cl); 
    ZipEntry entry = jarFile.getEntry("svnversion.properties"); 
    Properties props = new Properties(); 
    try { 
     props.load(jarFile.getInputStream(entry)); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 

    if (props.containsKey("svnversion")) { 
     String svnv = props.getProperty("svnversion"); 
     return fromString(svnv); 
    } else { 
     return null; 
    } 
} 

這就是爲什麼,恕我直言,你可能會更好存儲svn版本號本身作爲最終的靜態變量(並使用svn $Revision$關鍵字)。