2009-02-17 3 views
3

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

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

Дано:

  • Tomcat не является единственным способом приложение будет развернуто
  • Мы не имеем никакого контроля о том, где приложение может быть помещен.
  • Относительные пути не будут работать так Vista используется и Vista разбивает относительные пути.
  • Это должно работать на всех ОС, включая (но не ограничиваясь) Linux, XP и Vista.
  • EDIT Я подразумевал это, но в случае, если я был недостаточно ясен, у меня нет способа узнать путь String.
+1

Я не думаю, что относительные пути - отличное решение (то, что его родственник в конечном итоге сильно зависит от сервера приложений). Но с каких пор «Vista нарушает относительные пути»? Это не имеет никакого смысла. – jsight

+0

Я согласен, что это произошло не через несколько месяцев, когда мне передали относительные пути, и ни один из них не работал, я должен сделать вывод, что Vista что-то нарушает. Я не системный администратор, и когда я спрашиваю системных администраторов, я получаю от них пустой взгляд. – WolfmanDragon

+0

Именно поэтому я использую System.getProperties («user.dir»), он вернет правильный путь в Vista, XP и Linux. Но не кошка. – WolfmanDragon

ответ

2

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

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


Редактировать: Файл свойств относится к приложению. См. 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/ 

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

+0

Работы на Vista, прошедшие тестирование на Tomcat. спасибо +1 – WolfmanDragon

+0

У меня никогда не было ответа с стороны tomcat, на данный момент я принимаю ваш ответ, так как он действительно работает на Vista. Меня только пугает то, что произойдет с Windows 7. Возможно, будет еще одна публикация. Благодарю. – WolfmanDragon

2

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

+0

Я вроде бы хотел получить ServletContext в файле нормального класса. – Powerlord

+0

Благодарим вас за своевременный ответ, но методы getResource требуют строки пути. Я не могу предсказать путь, который будет использоваться. – WolfmanDragon

+0

@ R.Bemrose, я пытался найти способ взломать это. – WolfmanDragon

0

Вы можете разместить свои файлы свойств в вашем пути к классам и читать их в качестве входного потока с помощью что-то вроде:

ClassName.class.getResourceAsStream (Filepath + FileName);

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

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

ClassName.class.getResource (Filepath + Filename) .getPath()

+0

@neesh, если вы не знаете filePath, как вы используете его в вызове getResource()? Я уверен, что я просто не понимаю, что вы говорите. – WolfmanDragon

+0

Итак, скажем, вы не знаете filePath и хотите узнать абсолютный путь каталога, в котором развертывается ваше веб-приложение. Вы можете сделать это: ClassName.class.getResource ("/"). GetPath(); – neesh

+0

Не работает на Vista. В противном случае было бы хорошим решением. +1 – WolfmanDragon

0

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

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

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

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

  • /WebApps/WEB-INF/классы/
  • основание одного из ваших файлов .jar
+0

Spring - это не вариант, это ситуация, когда она должна быть агностикой для всего. EXCEPT java (сервлет, являющийся частью java API). Спасибо за ваш ответ. – WolfmanDragon

+0

Похоже, ваша ситуация сложная. – Akrikos

1

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

Что-то, как это должно работать:

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

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

+0

На чем угодно, кроме Vista. Vista разбивает его. но это самый близкий человек до сих пор. +1 – WolfmanDragon

+0

OHNO! Человек, который сосет. Если бы у меня была перспектива, которую я бы тестировал, чтобы узнать, могу ли я найти ответ. Удачи вам в этом. – Akrikos

0

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

0

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

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

1

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

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

+0

Это была одна из самых ранних попыток исправить. Не работает по всем направлениям. Он идет в файл Tomcat, а не в исходный файл. – WolfmanDragon

0

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

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