2009-09-10 20 views
25

Pakuję aplikację WWW JSP, która opiera się na niektórych ustawieniach ścieżki pliku w web.xml. Ustawienia te są nieznane w czasie pakowania, ponieważ odnoszą się do ścieżki, którą klient ustawi podczas wdrażania całej aplikacji (której aplikacja internetowa jest interfejsem zarządzania).Odwoływanie się do zmiennych środowiskowych w web.xml

Wygląda na to, że najprostszym sposobem na uniknięcie tokenów i modyfikacji plików w skrypcie instalatora jest zapytanie użytkownika o lokalizację instalacji, ustawienie tej lokalizacji jako zmiennej środowiskowej (np. JAVA_HOME) i zawsze mieć odniesienie do web.xml ta zmienna.

Czy istnieje sposób odniesienia do wartości zmiennej środowiskowej z poziomu pliku web.xml? Wyszukiwania Google prowadzą do metody J2EE ustawiania zmiennych środowiskowych z plików XML ejb. Nie tego szukam.

+0

Spójrz na pierwszą opcję w zaakceptowanej odpowiedzi [tutaj] (http://stackoverflow.com/questions/2161054/where-to-place-configuration-properties-files-in-a-jsp-servlet-web -podanie). Korzystając z ładowania zasobów z zewnętrznego pliku, który musi być dostępny tylko w ścieżce klas, myślę, że możesz osiągnąć to, co chcesz. – gamliela

+0

Wiem, że możesz przynajmniej odwołać się do zmiennej HOME env w następujący sposób $ {user.home} -> Nie jesteś pewien, czy to pomoże, ale może wykorzystasz to w kreatywny sposób. Zobacz [SSL HOWTO] (http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html) jest – nsof

Odpowiedz

11

myślę, że nie chcesz używać zmiennych środowiskowych (co moim zdaniem nie są dostępne z web.xml), ale środowisko wpisy [1, 2]. tak:

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

można użyć SomeFilePath jak:

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

Problem polega na tym, że aplikacja internetowa generuje kod, którego nie chciałbym , z wyjątkiem zmiany wartości określonej zmiennej w pliku web.xml. Tak więc szukam sposobu na ustawienie wartości w sposób, który będzie odwoływał się do wstępnie ustawionej zmiennej środowiskowej. –

+0

jak powiedziałem: myślę, że nie jest możliwe użycie zmiennych środowiskowych w deskryptorach wdrażania. nie ma mowy o zmianie kodu, obawiam się. –

8

Zasadniczo, nie rób tego w ten sposób. Wartość web.xml powinna zawierać wartości domyślne dla rzeczy, tak, ale należy je zastąpić podczas faktycznego wdrażania. Jeśli wdrażasz serwer Tomcat, możesz to zrobić, wprowadzając odpowiednie wpisy w pliku context.xml, którego używasz do wdrożenia. Na przykład:

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

Inne pojemniki będą miały swoje własne mechanizmy, aby to zrobić. Będziesz musiał przejrzeć ich dokumentację (lub poprosić o pomoc bardziej skoncentrowaną).

30

Można użyć Ant stylu podstawienia zmiennej w którymś z plików konfiguracyjnych kocur XML, takich jak:

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

Gdzie foo jest Java System Property (sysprop).

Nie można używać OS Environment Variables (envvars) bezpośrednio, myślę ...

Aby korzystać envvars, można umieścić

set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%" 

w bin/setenv.bat (lub podobnie w bin/setenv.sh dla * nix). Może być konieczne utworzenie tego pliku. Tomcat uruchomi ten plik po uruchomieniu.

Jako, że CATALINA_OPTS jest envvar (w przeciwieństwie do opcji wiersza poleceń), nie powinno być widoczne dla innych użytkowników w systemie (zachowaj starsze Uniksy), chociaż tego nie testowałem.

http://tomcat.apache.org/tomcat-7.0-doc/config/

Jeśli używasz Spring, można utworzyć <context:property-placeholder/> fasoli i następnie bezpośrednio korzystać envvars lub sysprops w Spring XML pliki konfiguracyjne (choć nie web.xml).

+0

Testowałem z Tomcat 7, to działa dla mnie. Ale czy to jest przenośne? A może jest to specyficzne dla Tomcata? – mcoolive

+0

Czy możesz rozwinąć sposób używania obiektu-placeholder do używania envvars w web.xml? – Adam

+0

@Adam Nie sądzę, aby można było użyć obiektu zastępczego w web.xml, tylko w plikach konfiguracyjnych xml wiosennej. –

1

nie jestem całkowicie jasne, na swoich ograniczeń, ale tylko być może można to zrobić (jestem przy założeniu, że jest to startowe param starasz się skonfigurować):

1) Zostaw zmienna nieokreślone w web.xml
2) Utwórz ServletContextListener i dodać, że do aplikacji
3) Słuchaj dla inicjalizacji swojej serwletu
4) Ustaw init-param dla serwletu w tym momencie

próbowałem to z podobnym problemem, ale mi się nie udało, ponieważ okazało się, że trzecia strona serwlet (z którym również nie miałem ochoty zadzierać) nie zachowywał się w ogóle jak serwlet, więc kontekst nie został zainicjowany. Ale może to ma szansę tutaj ...

1

Trzeba umieścić env-entry w kolejności:

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

Else będziesz miał błąd sprawdzania poprawności na web.xml

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