Ссылка на переменные окружения в web.xml
Я предварительно упаковываю веб-приложение JSP, которое опирается на некоторые параметры пути к файлу, найденные в web.xml. Эти параметры неизвестны во время упаковки, поскольку они ссылаются на путь, который клиент установит при развертывании всего приложения (из которого веб-приложение является интерфейсом управления).
Кажется, что самый простой способ избежать токенов и модификаций файлов в моем установщике script - попросить пользователя установить место установки, установить это местоположение как переменную среды (например, JAVA_HOME) и всегда иметь web.xml ссылку на эту переменную.
Есть ли способ ссылаться на значение переменной среды из web.xml? Поиски Google ведут к J2EE-методу переменных среды SETTING из файлов XML файла ejb. Это не то, что я ищу.
Ответы
Ответ 1
Вы можете использовать подстановку переменных Ant -style в любом из файлов конфигурации tomcat xml, например:
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>${foo}</url-pattern>
</servlet-mapping>
Где foo
является Java System Property (sysprop).
Вы не можете использовать Переменные OS Environment... (envvars) напрямую, я думаю...
Чтобы использовать envvars, вы можете поместить
set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%"
в bin/setenv.bat
(или аналогично в bin/setenv.sh
для * nix). Возможно, вам понадобится создать этот файл. Tomcat запустит этот файл при запуске.
Поскольку CATALINA_OPTS
является envvar (в отличие от опции командной строки), он не должен быть видимым другими пользователями в системе (за исключением древних Unix), хотя я не тестировал это.
http://tomcat.apache.org/tomcat-7.0-doc/config/
Если вы используете Spring, вы можете создать <context:property-placeholder/>
bean, а затем напрямую использовать envvars или sysprops в Spring файлах конфигурации XML (хотя не web.xml
).
Ответ 2
Я думаю, что вы не хотите использовать переменные среды (которые, я думаю, недоступны из web.xml), но записи в среде [1, 2]. так:
<env-entry>
<env-entry-name>Bla/SomeFilePath</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>/opt/bla</env-entry-value>
</env-entry>
вы можете использовать SomeFilePath, например:
InitialContext ic = new InitialContext();
String s = (String) ic.lookup("java:comp/env/ejb/Bla/SomeFilePath");
Ответ 3
В принципе, вы этого не делаете. web.xml
должен содержать значения по умолчанию для вещей, да, но вы должны переопределить их при фактическом развертывании. Если вы развертываете Tomcat, вы делаете это, введя соответствующие записи в context.xml
, которые вы используете для развертывания. Например:
<Context path="/app">
<!-- For things described by webapp parameters -->
<Parameter name="foobar" value="grill" />
<!-- For things described by environment entries -->
<Environment name="Bla/SomeFilePath" type="java.lang.String"
value="/opt/bla" />
</Context>
Другие контейнеры будут иметь свои собственные механизмы для этого. Вам придется искать свою документацию (или сделать запрос на помощь более сосредоточенным).
Ответ 4
Я не совсем понимаю ваши ограничения, но, возможно, вы можете это сделать (я предполагаю, что это init-param, который вы пытаетесь настроить):
1) Оставьте переменную неопределенной в web.xml
2) Создайте ServletContextListener и добавьте это в свое приложение
3) Слушайте инициализацию своего сервлета
4) Установите параметр init для сервлета в этой точке
Я попробовал это с аналогичной проблемой, но мне это не удалось, потому что оказалось, что 3-й сторонний сервлет (который я также не хотел связывать) не вел себя как сервлет вообще, поэтому контекст никогда не инициализировался. Но, возможно, здесь есть шанс...
Ответ 5
Вы должны ввести env-entry в порядок:
<env-entry>
<env-entry-name>maxAmount</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>aString</env-entry-value>
</env-entry>
Иначе у вас будет ошибка проверки на web.xml
ref: https://community.oracle.com/thread/840452?tstart=0
Ответ 6
К переменным окружения можно обращаться в xml файлах следующим образом:
${env.ENVIRONMENT_VARIABLE_NAME}
Очевидно, что могут возникнуть проблемы с настройками учетной записи пользователя и проблемами доступа, но я попытался с системными переменными, и он работает!