Путь к файлу Java в веб-проекте - PullRequest
3 голосов
/ 01 августа 2011

Мне нужен доступ к файлам ресурсов в моем веб-проекте из класса. Проблема в том, что пути при разработке отличаются от развернутых путей.

Например, если я хочу получить доступ к некоторому файлу CSS во время разработки, я могу сделать так:

File file = new File("src/main/webapp/resources/styles/some.css/");

Но это может не сработать после развертывания, поскольку в целевой папке нет каталогов src или main. Итак, как я могу получить доступ к файлам последовательно?

Ответы [ 5 ]

5 голосов
/ 01 августа 2011

Вы, кажется, храните свой CSS-файл в classpath по какой-то неочевидной причине.Имя папки src является типичным именем по умолчанию для исходной папки проекта Eclipse.И то, что он, по-видимому, волшебным образом работает как относительный путь в конструкторе File (плохой, плохой), только подтверждает, что вы запускаете его в контексте IDE.

Это действительно не переносимо.

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

InputStream input = getClass().getResourceAsStream("/main/webapp/resources/styles/some.css");
// ...

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

См. Также:


Обновление : ах, функциональные требования теперь более понятны.

На самом деле яхочу получить lastModified из файла.Возможно ли это с InputStream?-

Используйте getResource() вместо этого, чтобы получить его как URL.Затем вы можете открыть соединение по нему и запросить lastModified.

URL url = getClass().getResource("/main/webapp/resources/styles/some.css");
long lastModified = url.openConnection().getLastModified();
// ...
3 голосов
/ 01 августа 2011

Если вам нужно открыть файл, который находится внутри видимой браузером части приложения, я бы предложил использовать ServletContext.getRealPath (...)

Таким образом:

File f = new File(this.getServletContext().getRealPath("relative/path/to/your/file"));

Примечание: если вы не находитесь внутри сервлета, вам, возможно, придется перепрыгнуть через некоторые дополнительные обручи, чтобы получить ServletContext, но он всегда должен быть доступен вам в сетисреда.Это решение также позволяет вам поместить файл .css туда, где его может увидеть браузер пользователя, тогда как размещение под /WEB-INF/ скроет файл от пользователя.

1 голос
/ 01 августа 2011

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

getClass.getResource("/resources/styles/some.css")

или открыв файл с именем @ ig0774.

Если ресурс находится в каталоге, который не развернут в WAR (скажем, вам нужно изменить его без повторного развертывания), то вы можете использовать аргумент VM для определения пути к вашему ресурсу.

-Dresource.dir=/src/main/webapp/resources

и выполните поиск по этой переменной, чтобы загрузить ее.

1 голос
/ 01 августа 2011

Поместите ваши внешние ресурсы в подкаталог папки вашего проекта WEB-INF. Например, поместите ваши CSS-ресурсы в WEB-INF/styles, и вы сможете получить к ним доступ как:

новый файл ("styles / some.css");

Если вы не используете стандартную WAR для развертывания, в этом случае вам следует объяснить настройки.

0 голосов
/ 01 августа 2011

В веб-проекте Java стандартный каталог, например:

{WEB-ROOT} / 
           /WEB-INF/
           /WEB-INF/lib/
           /WEB-INF/classes

Итак, если вы можете получить путь к файлам классов в динамической файловой системе, вы можете получить путь к файлу ресурсов.

вы можете получить путь (/ WEB-INF / classes /) следующим образом:

this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()

, а затем следующий ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...