2009-04-27 5 views
7

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

Один из файлов в файле 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 

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

ответ

7

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

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(); 

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

+0

Когда я нашел эту проблему, моя первая идея была «да, может быть, единственный способ написать временный файл!». И удивление, это единственный способ! Как может быть, что нет способа обработать путь в банке? Если вы можете получить поток, вы можете получить файл в идеальном мире. –

1

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

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

+0

Спасибо Крису. Я уверен, что Word нуждается в абсолютном пути и будет путать путь JAR/ZIP-стиля. Я действительно лениво копирую исходный файл в папку temp, я просто оставил это из своего ответа ради краткости. –

0

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

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