Как сервлет может получить абсолютный путь к файлу вне сервлета? - PullRequest
3 голосов
/ 17 февраля 2009

Мы использовали System.getProperties ("user.dir"), чтобы получить местоположение файла свойств. Теперь, когда он был развернут на Tomcat (через сервлет), системный вызов задает местоположение как tomcat, а не в том месте, где существует файл свойств.

Как мы можем динамически вызывать файл свойств?

Дано:

  • Tomcat - не единственный способ приложения будет развернуто
  • У нас нет контроля над тем, где приложение может быть размещен.
  • Относительные пути не будут работать как таковые Vista используется, и Vista ломается относительные пути.
  • Это должно работать на всех ОС, включая (но не ограничиваясь) Linux, XP и Vista.
  • РЕДАКТИРОВАТЬ Я подразумевал это, но в случае, если я не был достаточно ясен, я не могу о знании пути Строка.

Ответы [ 9 ]

2 голосов
/ 18 февраля 2009

У вас должен быть способ узнать путь к файлу свойств, который вы можете затем обернуть в файл и передать методу load () вашего объекта свойств.

Если вы работаете внутри службы Tomcat, вы не работаете как пользователь, у которого вы ее установили, поэтому вы не можете получить домашний каталог. Скорее всего, вам нужно жестко кодировать ЧТО-ТО.


Редактировать: файл свойств относится к приложению. См. http://www.exampledepot.com/egs/java.lang/ClassOrigin.html для примера того, как получить имя файла для байт-кода для данного класса. Вы должны быть в состоянии продолжить оттуда.

Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/

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

2 голосов
/ 17 февраля 2009

Взгляните на ServletContext getResource и getResourceAsStream методы.

1 голос
/ 25 марта 2009

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

Это подразумевает, что веб-приложение развернуто как «расширенное», т. Е. Не как сжатый военный файл, но именно так и поступает большинство приложений.

1 голос
/ 18 февраля 2009

Думаю, ClassName.class.getResourceAsStream () будет работать для вас. Комментарии к этому методу указывают на ClassLoader.getResource () , который говорит вам, как указать файл в вашем classpath.

Примерно так должно работать:

InputStream foo = ClassName.class.getResourceAsStream("file.name");

Где file.name находится где-то у основания вашего classpath. Если file.name находится в пакете com.foo.bar, вы должны использовать "/com/foo/bar/file.name"

0 голосов
/ 19 марта 2011

У нас были те же требования. Самая простая вещь, которая до сих пор работала, состояла в том, чтобы просто сохранить свойство basedir в одном из файлов свойств, которые мы уже загружали. Затем определите метод, как getExternalDocPath (String path).

Это позволило нам расширить базу документации Tomcat (которую поддерживает только Tomcat 7?). В сети кто-то опубликовал класс, который на самом деле расширяет базу документов Tomcat, позволяя использовать несколько путей, то есть «alpha; baker; charlie».

0 голосов
/ 18 февраля 2009

Вы можете сохранить расположение файла свойств в JNDI?

Это должно быть переносимо через Tomcat и для серверов приложений Java EE.

0 голосов
/ 18 февраля 2009

Другим подходом может быть передача значения переменной в JVM с параметром -D. Таким образом, вы можете привязать свой код к одному и тому же имени переменной, а затем передать разные значения во время запуска. Я не пробовал это, но я думаю, что это должно работать и для приложения, развернутого в Tomcat, если вы измените скрипт startCatalina для передачи параметра -D в JVM

0 голосов
/ 18 февраля 2009

Можно ли поместить файл конфигурации в classpath и ссылаться на него через что-то вроде пружин ClassPathResource ?

Вы должны использовать его следующим образом:

ClassPathResource foo = new ClassPathResource("file.name");

Где file.name существует где-то в пути к классам на самом низком уровне, например:

  • / WebApps / WEB-INF / классы /
  • база одного из ваших файлов jar
0 голосов
/ 17 февраля 2009

Вы можете поместить файлы свойств в путь к классу и прочитать их как поток ввода, используя что-то вроде:

ClassName.class.getResourceAsStream (filePath + fileName);

Где filePath - относительный путь к файлу из корня пути к классу, а fileName - имя файла.

Если вам нужно получить абсолютный путь к файлу, который вы читаете как ресурс, вы можете сделать что-то вроде этого:

ClassName.class.getResource (filePath + fileName) .getPath ()

...