簡體   English   中英

java:獲得正確的資源

[英]java: getting the right resource

我有一個庫foo.jar ,它包含一個svnversion.properties文件(看起來像svnversion=12345M或其他)以及class SVNVersion的以下靜態方法:

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;
    }
}

我還有一個包含svnversion.properties文件的庫bar.jar (假設它包含svnversion=789 )。

但是,當我在bar.jarclass SomeClassInBarJar中運行以下內容時:

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

你顯然不能使用這種方法,因為無論svnversion.properties文件是什么,都將始終使用類加載器。 它與您在類中看到的行為相同:如果類路徑上有兩個具有相同名稱的類,那么首先使用的是它。

一個(錯綜復雜的)方法是找出一個類屬於哪個jar,然后檢索該jar中的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$ keyword)。

暫無
暫無

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

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