java - Referencia a variables de entorno en web.xml
environment-variables (6)
Básicamente, no lo haces así. El web.xml
debe contener valores predeterminados para las cosas, sí, pero debe anularlos cuando realice la implementación. Si está implementando en Tomcat, haga esto incluyendo las entradas apropiadas en el context.xml
que usa para la implementación. Por ejemplo:
<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>
Otros contenedores tendrán sus propios mecanismos para hacerlo. Tendrá que buscar su documentación (o hacer que su solicitud de ayuda sea más específica).
Estoy preempacando una aplicación web JSP que se basa en algunas configuraciones de ruta de archivo encontradas en web.xml. Estas configuraciones son desconocidas en el momento del empaquetado, porque hacen referencia a una ruta que el cliente establecerá al implementar la aplicación completa (de la cual la aplicación web es una interfaz de administración).
Parece que la forma más sencilla de evitar tokens y modificaciones de archivos en mi script de instalación, es pedirle al usuario una ubicación de instalación, establecer esta ubicación como una variable de entorno (por ejemplo, JAVA_HOME), y tener web.xml siempre hace referencia a esa variable.
¿Hay alguna forma de hacer referencia a un valor de variable de entorno desde web.xml? Las búsquedas en Google conducen al método J2EE de CONFIGURAR las variables de entorno de los archivos ejb xml. Esto no es lo que estoy buscando.
Creo que no quieres usar variables de entorno (que creo que no son accesibles desde web.xml), sino entradas de entorno [ 1 , 2 ]. al igual que:
<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>
Puedes usar SomeFilePath como:
InitialContext ic = new InitialContext();
String s = (String) ic.lookup("java:comp/env/ejb/Bla/SomeFilePath");
No estoy totalmente seguro de tus limitaciones, pero tal vez puedas hacer esto (supongo que lo que estás intentando configurar es un parámetro de inicio):
1) Dejar la variable sin especificar en web.xml.
2) Cree un ServletContextListener y agréguelo a su aplicación
3) Escucha la inicialización de tu servlet.
4) Establecer el init-param para el servlet en ese punto
Intenté esto con un problema similar, pero me falló porque resultó que el servlet de terceros (con el que tampoco quería meterme) no se estaba comportando como un servlet en absoluto, por lo que el contexto nunca llegó a funcionar. inicializado Pero tal vez tenga una oportunidad aquí ...
Puede usar la sustitución de variables de estilo Ant en cualquiera de los archivos de configuración xml de tomcat, como:
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>${foo}</url-pattern>
</servlet-mapping>
Donde foo
es una propiedad del sistema Java (sysprop).
No se pueden usar las variables de entorno del sistema operativo (envvars) directamente, creo ...
Para usar envvars, puedes poner
set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%"
en bin/setenv.bat
(o similarmente en bin/setenv.sh
para * nix). Es posible que necesite crear ese archivo. Tomcat ejecutará este archivo cuando se inicie.
Como CATALINA_OPTS
es un envvar (a diferencia de una opción de línea de comando), no debería ser visible por otros usuarios en el sistema (guardar Unixes antiguos), aunque no lo he probado.
http://tomcat.apache.org/tomcat-7.0-doc/config/
Si está utilizando Spring, puede crear un bean <context:property-placeholder/>
y luego usar directamente envvars o sysprops en los archivos de configuración XML de Spring (aunque no sea web.xml
).
Se puede acceder a las variables de entorno en archivos xml como este:
${env.ENVIRONMENT_VARIABLE_NAME}
Obviamente, puede haber problemas con la configuración de la cuenta de usuario y los problemas de acceso, ¡pero he intentado con las variables del sistema y funciona!
Tienes que poner la entrada env en orden:
<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>
De lo contrario, tendrá un error de validación en web.xml.