Как сервлет может получить абсолютный путь к файлу вне сервлета?
Мы использовали 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 ()