Как пройти через ресурсы класса Java? - PullRequest
16 голосов
/ 15 апреля 2009

Я знаю, что мы можем сделать что-то вроде этого:

Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf")

для чтения файлов, упакованных в наш jar-файл.

Я много гуглил, и, конечно, я не использую правильные термины; что я хочу сделать, это перечислить доступные ресурсы, что-то вроде этого:

Class.class.listResources("/com/yourcompany/yourapp")

Это должно вернуть список ресурсов, которые находятся внутри пакета com.yourcompany.yourapp.*

Это возможно? Есть идеи, как это сделать, если это не так легко, как я показал?

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

Ответы [ 4 ]

10 голосов
/ 15 апреля 2009

Для ресурсов в файле JAR примерно так работает:

URL url = MyClass.class.getResource("MyClass.class");
String scheme = url.getProtocol();
if (!"jar".equals(scheme))
  throw new IllegalArgumentException("Unsupported scheme: " + scheme);
JarURLConnection con = (JarURLConnection) url.openConnection();
JarFile archive = con.getJarFile();
/* Search for the entries you care about. */
Enumeration<JarEntry> entries = archive.entries();
while (entries.hasMoreElements()) {
  JarEntry entry = entries.nextElement();
  if (entry.getName().startsWith("com/y/app/")) {
    ...
  }
}

Вы можете сделать то же самое с ресурсами, "взорванными" в файловой системе или во многих других репозиториях, но это не так просто. Вам нужен определенный код для каждой схемы URL, которую вы хотите поддерживать.

4 голосов
/ 15 апреля 2009

Как правило, невозможно получить список таких ресурсов. Некоторые загрузчики классов могут даже не иметь возможности поддерживать это - представьте загрузчик классов, который может извлекать отдельные файлы с веб-сервера, но веб-сервер не должен поддерживать перечисление содержимого каталога. Разумеется, для jar-файла вы можете явно загрузить содержимое jar-файла.

( Этот вопрос похож, кстати.)

2 голосов
/ 15 апреля 2009

Я искал способ составить список содержимого файла jar с помощью загрузчиков классов, но, к сожалению, это кажется невозможным. Вместо этого вы можете открыть банку в виде zip-файла и получить содержимое таким образом. Вы можете использовать стандартные ( здесь ) способы чтения содержимого файла JAR, а затем использовать загрузчик классов для чтения содержимого.

0 голосов
/ 15 апреля 2009

Я обычно использую

getClass().getClassLoader().getResourceAsStream(...)

но я сомневаюсь, что вы можете перечислить записи из пути к классам, не зная их априори.

...