2009-09-10 50 views
25

Estoy empaquetando previamente 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, ya que hacen referencia a una ruta que el cliente establecerá al implementar toda la aplicación (de la cual la aplicación web es una interfaz de administración).Variables de entorno de referencia en web.xml

Parece que la forma más fácil de evitar tokens y modificaciones de archivos en mi script instalador es pedirle al usuario una ubicación de instalación, establecer esta ubicación como una variable de entorno (por ejemplo, JAVA_HOME) y hacer que web.xml siempre haga referencia esa variable.

¿Hay alguna manera de hacer referencia a un valor de variable de entorno desde dentro de web.xml? Las búsquedas de Google conducen al método J2EE de CONFIGURAR las variables de entorno de los archivos ejb xml. Esto no es lo que estoy buscando.

+0

Eche un vistazo a la primera opción en la respuesta aceptada [aquí] (http://stackoverflow.com/questions/2161054/where-to-place-configuration-properties-files-in-a-jsp-servlet-web -solicitud). Al utilizar la carga de recursos desde un archivo externo, que solo debe estar disponible en su classpath, creo que puede lograr lo que desea. – gamliela

+0

Sé que al menos puede hacer referencia a la variable de entorno HOME de la siguiente manera $ {user.home} -> No estoy seguro si esto es útil, pero tal vez lo use de una manera creativa. Ver [CÓMO SSL HOWTO] (http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html) hay un – nsof

Respuesta

11

Creo que usted no desea utilizar variables de entorno (que creo que no son accesibles desde web.xml), pero el medio ambiente entradas [1, 2]. de este modo:

<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> 

puede utilizar como SomeFilePath:

InitialContext ic = new InitialContext(); 
String s = (String) ic.lookup("java:comp/env/ejb/Bla/SomeFilePath"); 
+1

El problema es que la aplicación web es un código generado, que prefiero no meterme con , excepto cambiando el valor de una variable particular dentro de web.xml. Así que estoy buscando una forma de establecer solo el valor de una manera que haga referencia a una variable de entorno preestablecida. –

+0

como dije: creo que no es posible usar variables de entorno en los descriptores de despliegue. no hay forma de cambiar el código, me temo. –

8

Básicamente, usted no lo hacen de esa manera. 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 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 hacer esto. Deberá buscar su documentación (o hacer que su solicitud de ayuda esté más enfocada).

30

Usted puede usar al estilo hormiga sustitución de variables en cualquiera de los archivos de configuración de Tomcat XML, tales como:

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

Dónde foo es una Java System Property (sysprop).

No puede utilizar OS Environment Variables (envvars) directamente, creo ...

Para utilizar envvars, puede poner

set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%" 

en bin/setenv.bat (o similar en bin/setenv.sh de * nix). Es posible que necesite crear ese archivo. Tomcat ejecutará este archivo cuando comience.

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 la primavera, puede crear un grano <context:property-placeholder/> y luego usar directamente o envvars sysprops en la primavera de XML archivos de configuración (aunque no web.xml).

+0

Probé con Tomcat 7, me funciona. ¿Pero es portátil? ¿O es específico de Tomcat? – mcoolive

+0

¿Podría ampliar la forma de usar property-placeholder para usar envvars en web.xml? – Adam

+0

@ Adam No creo que pueda usar el marcador de posición de propiedad en web.xml, solo en los archivos de configuración xml de primavera –

1

no estoy totalmente claro en sus limitaciones, pero sólo tal vez usted puede hacer esto (estoy asumiendo que es un init-param que está tratando de configurar):

1) Deja la variable no especificada en web.xml
2) Crear un ServletContextListener y añadir que a su aplicación
3) Escuchar para la inicialización de servlet
4) Ajuste el init-param para el servlet en ese punto

he intentado esto con un problema similar, pero falló para mí porque resultó que el tercero servlet (con el que tampoco quería meterme) no se comportaba realmente como un servlet, por lo que el contexto nunca se inicializó. Pero tal vez tiene una oportunidad aquí ...

1

Tienes que poner el env-entry 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á error de validación en web.xml

ref: https://community.oracle.com/thread/840452?tstart=0

Cuestiones relacionadas