web-dev-qa-db-fra.com

Référencement des variables d'environnement dans web.xml

Je suis en train de pré-emballer une application Web JSP qui repose sur certains paramètres de chemin de fichier trouvés dans le fichier web.xml. Ces paramètres sont inconnus au moment de la création du package, car ils font référence au chemin que le client définira lors du déploiement de l'application complète (dont l'application Web est une interface de gestion). 

Il semble que le moyen le plus simple d’éviter les modifications de jetons et de fichiers dans mon script d’installation est de demander à l’utilisateur un emplacement d’installation, de définir cet emplacement en tant que variable d’environnement (par exemple, Java_HOME) et de laisser Web.xml toujours référencer cette variable.

Y a-t-il un moyen de référencer une valeur de variable d'environnement à partir de web.xml? Les recherches Google conduisent à la méthode J2EE de définition des variables d’environnement à partir de fichiers XML ejb. Ce n'est pas ce que je cherche.

27
Udi Bar-On

Vous pouvez utiliser la substitution de variable de style Ant dans n’importe quel fichier de configuration XML Tomcat, tel que:

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

foo est un Java System Property (sysprop).

Vous ne pouvez pas utiliser Variables d'environnement de système d'exploitation (envvars) directement, je pense ... 

Pour utiliser envvars, vous pouvez mettre

set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%"

dans bin/setenv.bat (ou de la même manière dans bin/setenv.sh pour * nix). Vous devrez peut-être créer ce fichier. Tomcat exécutera ce fichier au démarrage.

Comme CATALINA_OPTS est une variable d'environnement (par opposition à une option de ligne de commande), il ne devrait pas être visible par les autres utilisateurs du système (enregistrez les anciens Unix), bien que je ne l'aie pas testé.

http://Tomcat.Apache.org/Tomcat-7.0-doc/config/

Si vous utilisez Spring, vous pouvez créer un bean <context:property-placeholder/> et ensuite utiliser directement envvars ou sysprops dans les fichiers de configuration XML Spring (bien que pas web.xml). 

34
Neil McGuigan

je pense que vous ne voulez pas utiliser de variables d’environnement (qui, selon moi, ne sont pas accessibles à partir de web.xml), mais d’environnement entrées [ 1 , 2 ]. ainsi:

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

vous pouvez utiliser SomeFilePath comme:

InitialContext ic = new InitialContext();
String s = (String) ic.lookup("Java:comp/env/ejb/Bla/SomeFilePath");
11
ax.

En gros, vous ne le faites pas de cette façon. Le web.xml doit contenir des valeurs par défaut pour les objets, oui, mais vous devez les remplacer lorsque vous effectuez le déploiement. Pour ce faire, vous devez inclure les entrées appropriées dans le context.xml que vous utilisez pour le déploiement. Par exemple:

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

Les autres conteneurs auront leurs propres mécanismes pour le faire. Vous devrez consulter leur documentation (ou faire votre demande d'aide plus ciblée).

8
Donal Fellows

Les variables d’environnement peuvent être consultées dans des fichiers XML comme ceci:

${env.ENVIRONMENT_VARIABLE_NAME}

Évidemment, il peut y avoir des problèmes avec les paramètres de compte d'utilisateur et les problèmes d'accès, mais j'ai essayé avec les variables système et cela fonctionne!

1
E pluribus Unum

Vous devez mettre l'env-entrée dans l'ordre:

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

Sinon, vous aurez une erreur de validation sur web.xml

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

1
Sayeed S. Alam

Je ne suis pas tout à fait clair sur vos limites, mais juste peut-être que vous pouvez le faire (je suppose que c'est un init-param que vous essayez de configurer):

1) Laissez la variable non spécifiée dans web.xml
2) Créez un ServletContextListener et ajoutez-le à votre application
3) Ecoutez l'initialisation de votre servlet
4) Définissez le paramètre init pour le servlet à cet endroit

J'ai essayé cela avec un problème similaire, mais cela a échoué pour moi, car il s'est avéré que le servlet tiers (que je ne voulais pas non plus déranger) ne se comportait pas du tout comme un servlet. initialisé. Mais peut-être qu'il a une chance ici ...

1
Toby Eggitt