Получить абсолютный путь к файлу в JAR в EAR? - PullRequest
7 голосов
/ 27 апреля 2009

У меня есть приложение J2EE, развернутое в виде файла EAR, которое, в свою очередь, содержит файл JAR для кода бизнес-уровня (включая некоторые EJB) и файл WAR для кода веб-уровня. Файл EAR развертывается в JBoss 3.2.5, который распаковывает файлы EAR и WAR, но не файл JAR (это не проблема, это просто FYI).

Один из файлов в JAR-файле представляет собой шаблон MS Word, абсолютный путь которого необходимо передать в некоторый собственный код MS Word (используя Jacob , FWIW).

Проблема заключается в том, что если я пытаюсь получить файл, подобный этому (из некоторого кода в файле JAR):

URL url = getClass().getResource("myTemplate.dot");
File file = new File(url.toURI()); // <= fails!
String absolutePath = file.getAbsolutePath();
// Pass the absolutePath to MS Word to be opened as a document

... тогда конструктор java.io.File создает исключение IllegalArgumentException «URI не является иерархическим». URL и URI имеют одинаковый вывод toString (), а именно:

jar:file:/G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents/myapp.jar!/my/package/myTemplate.dot

Эта большая часть пути действительна в файловой системе, а остальная часть - нет (является внутренней частью файла JAR):

G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents

Какой самый простой способ получить абсолютный путь к этому файлу?

Ответы [ 3 ]

6 голосов
/ 27 апреля 2009

Мое текущее решение - скопировать файл во временный каталог сервера, а затем использовать абсолютный путь к копии:

File tempDir = new File(System.getProperty("java.io.tmpdir"));
File temporaryFile = new File(tempDir, "templateCopy.dot");
InputStream templateStream = getClass().getResourceAsStream("myTemplate.dot");
IOUtils.copy(templateStream, new FileOutputStream(temporaryFile));
String absolutePath = temporaryFile.getAbsolutePath();

Я бы предпочел решение, не включающее копирование файла.

1 голос
/ 27 апреля 2009

Если код или приложение, которым вы передаете строку URI, не принимает формат, который указывает местоположение в файле jar / zip, ваше решение копирования файла во временное расположение, вероятно, является лучшим.

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

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

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

...