Файл и комплект ресурсов: // URL - PullRequest
8 голосов
/ 27 января 2012

Я долго ломал голову над этим и не могу найти решение этой проблемы:

У меня есть приложение Eclipse RCP, которое использует пользовательскую библиотеку, упакованную в виде jar. Из плагина я вызываю метод в банке. В рамках этого метода я «получаю» ресурс, используя this.class.getResource(relPath), тогда как relPath - это жестко заданный относительный путь к нужному мне файлу. Это возвращает мне URL, который я могу использовать для построения File.

Теперь это работает отлично, если я вызываю не этот метод из плагина, а из простой Java-программы. Разница: загрузчик классов Eclipse RCP возвращает URL протокола bundleresource://, который не поддерживается File, тогда как при запуске простой Java-программы возвращается file:// -URL, что вполне нормально для построения File.

Мне известен FileLocator -класс Eclipse SDK (который разрешает URL-адреса bundleresource-URL-адресов к URL-адресам файлов), но я не могу использовать его в библиотеке, поскольку не хочу связывать его с платформой Eclipse RCP - должна быть возможность использовать эту библиотеку также из источников, не относящихся к Eclipse-RCP.

Кто-нибудь знает, как я могу загрузить этот ресурс из относительного пути таким образом, чтобы он работал как при вызове метода из Eclipse RCP-Plugin, так и из любого другого клиента?

Мне нужно создать File в каталоге этого относительного пути для поиска файлов внутри. Я полностью застрял на этом ...

ОБНОВЛЕНИЕ : Если есть возможность, кроме использования File # list () , получить содержимое каталога, это уже помогло бы мне.

Любые советы приветствуются,

Ответы [ 2 ]

13 голосов
/ 15 февраля 2012

Не могли бы вы просто инвертировать зависимость.То есть ваш модуль, получающий ресурс как URL, определяет интерфейс

interface Locator { URL resolve(URL url); }

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

class StandaloneLocator implements Locator {
   public URL resolve(URL url) { return url; }
}

В случае Eclipse этот локатор по умолчанию должен быть заменен на

class EclipseLocator implements Locator {
  public URL resolve(URL url) { return FileLocator.resolve(url); }
}

Теперь ваша библиотека не имеет зависимостей от Eclipse, и вы все еще можете использовать FileLocator.Поскольку вы не получите никаких пакетов ресурсов с URL-адресами без Eclipse, это должно работать.

Cheers, Jens

0 голосов
/ 29 января 2012

Невозможно перечислить файлы в jar-файле, используя методы из Class. Вам нужно либо создать файл resourcelist, который будет содержать имена всех ваших ресурсов, либо открыть файл jar, например, zip-архив, и перечислить файлы, как в zip-архиве. Класс File не может обрабатывать протоколы, отличные от file://. Если ваш ресурс находится в jar-файле, вы должны использовать класс Url и получить поток, используя метод Url.openSteram для получения содержимого файла.

UPD относительно запуска простого Java-приложения: вы, вероятно, не упаковываете его в JAR-файл, поэтому ваши классы и ресурсы размещаются в файловой системе, а не в архиве. Вот почему вы получаете протокол file://. Если вы упакуете в файл JAR, протокол не будет file://, это будет jar:// (не уверен в точном названии протокола).

...