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

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

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

Дано:

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

9 ответов

Решение

У вас должен быть способ узнать путь к файлу свойств, который затем можно обернуть в файл и передать в метод 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/

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

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

Я думаю, 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"

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

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

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

Вы должны быть в состоянии использовать это так:

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

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

  • / WebApps/WEB-INF/ классы /
  • база одного из ваших файлов JAR

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

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

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

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

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

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

ClassName.class.getResourceAsStream (filePath + fileName);

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

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

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

Другие вопросы по тегам