2009-09-10 3 views
25

Я предварительно упакую веб-приложение JSP, которое опирается на некоторые параметры пути к файлу, найденные в web.xml. Эти параметры неизвестны во время упаковки, поскольку они ссылаются на путь, который клиент установит при развертывании всего приложения (из которого веб-приложение является интерфейсом управления).Ссылка на переменные окружения в web.xml

Похоже, что самый простой способ избежать токенов и модификаций файлов в моем сценарии установки - попросить пользователя установить место установки, установить это местоположение как переменную среды (например, JAVA_HOME) и всегда иметь ссылку web.xml эта переменная.

Есть ли способ ссылаться на значение переменной среды изнутри web.xml? Поиски Google ведут к J2EE-методу переменных среды SETTING из файлов XML-файла ejb. Это не то, что я ищу.

+0

Взгляните на первый вариант в принятом ответе [здесь] (http://stackoverflow.com/questions/2161054/where-to-place-configuration-properties-files-in-a-jsp-servlet-web -заявление). Используя загрузку ресурсов из внешнего файла, который должен быть доступен только в вашем пути к классам, я думаю, вы можете достичь того, чего хотите. – gamliela

+0

Я знаю, что вы можете хотя бы ссылаться на переменную HOME env следующим образом: $ {user.home} -> Не уверен, что это полезно, но, возможно, используйте это творчески. См. [SSL HOWTO] (http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html) есть – nsof

ответ

11

я думаю, что вы не хотите использовать переменные окружения (которые я думаю, не доступны из 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"); 
+1

Проблема заключается в том, что веб-приложение генерирует код, который я бы не путал с , за исключением изменения значения конкретной переменной в web.xml. Поэтому я ищу способ установить только значение таким образом, чтобы ссылаться на предварительно заданную переменную среды. –

+0

как я сказал: я думаю, что использовать переменные среды в дескрипторах развертывания невозможно. Боюсь, что я не могу изменить какой-то код. –

8

В принципе, вы не сделать это таким образом. 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> 

Другие контейнеры будут иметь свои собственные механизмы для этого. Вам нужно будет найти свою документацию (или сделать ваш запрос о помощи более сосредоточенным).

30

Вы можете использовать Ant стиле подстановку переменных в любой из файлов конфигурации XML кот, такие как:

<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>${foo}</url-pattern> 
</servlet-mapping> 

Где foo является Java System Property (sysprop).

Вы не можете использовать OS Environment Variables (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/> боб, а затем непосредственно использовать envvars или sysprops в Spring XML файлы конфигурации (хотя и не web.xml).

+0

Я тестировал с Tomcat 7, он работает для меня. Но он переносимый? Или это специфично для Tomcat? – mcoolive

+0

Не могли бы вы рассказать о том, как использовать свойство-placeholder для использования envvars в web.xml? – Adam

+0

@Adam Я не думаю, что вы можете использовать свойство-placeholder в web.xml, только весной config xml-файлы –

1

Я не совсем ясно, на свои ограничения, но только может быть, вы можете сделать это (я предполагаю, что это INIT-парам вы пытаетесь настроить):

1) Оставьте переменной не определено в web.xml
2) Создание контекста сервлета и добавить, что к приложению
3) Прослушайте для инициализации сервлета
4) Установите Init-параметры для сервлета в этой точке

Я попытался это с аналогичной проблемой, но мне это не удалось, потому что оказалось, что сторонняя сторона сервлет (который я также не хотел связывать) не вел себя вообще как сервлет, поэтому контекст никогда не инициализировался. Но, может быть, у него есть шанс здесь ...

1

Вы должны поместить ENV-запись в следующем порядке:

<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

исх: https://community.oracle.com/thread/840452?tstart=0

Смежные вопросы