2011-01-14 2 views
3

У меня есть библиотека foo.jar, которая содержит svnversion.properties файла (выглядит как svnversion=12345M или любые другой), и следующий статический метод class SVNVersion: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 дважды. Ясно, что я не делаю этого правильно. Как получить правильный файл svnversion.properties в корневом файле jar, содержащем данный класс? (Предполагается, что это там)


редактировать: Я просто попытался

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

и имеет ту же проблему. Кажется, я могу получить доступ к главному файлу jar файла /svnversion.properties, а не к библиотеке /svnversion.properties.

+1

Предоставление различного имени класса необязательно означает разные загрузчики классов. Я не думаю, что это возможно сделать так: –

+0

@Teja: Я понял это. :-) Мне интересно, как это сделать правильно. –

+0

Можете ли вы объяснить, как это сделать? –

ответ

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$).

+0

Замена ключевого слова svn, например $ Revision $ применяется только к отдельным файлам; Я хочу получить результат работы svnversion.exe во всей моей проверке. Во всяком случае, речь идет не только о версиях svn, но и о получении ресурсов из баков библиотеки или приложений. Спасибо за другие предложения. –

+1

Я понял это, но ясно, что вы неправильно понимаете, как работает классная загрузка. Если вы не загружаете разные банки в разных загрузчиках классов, вам никогда не удастся добиться того, чего вы хотите. –

+0

«но ясно, что вы не понимаете, как работает классная нагрузка». Я вообще не недопонимаю классную загрузку. То, что я недопонимал, это то, как getResource() и getResourceStream() и getResourceBundle() работают вместе с загрузчиками классов. –

Смежные вопросы