2009-09-10 147 views
25

我預先打包了一個JSP web-app,它依賴於web.xml中的一些文件路徑設置。這些設置在打包時未知,因爲它們引用客戶在部署整個應用程序(其中Web應用程序是管理界面)時設置的路徑。在web.xml中引用環境變量

看來,以避免在我的安裝腳本標記和文件修改的最簡單的方法,就是要求一個安裝位置的用戶,設置此位置爲一個環境變量(例如JAVA_HOME),並有web.xml中始終引用那個變量。

有沒有辦法在web.xml中引用環境變量值?谷歌搜索導致從ejb xml文件設置環境變量的J2EE方法。這不是我要找的。

+0

看看接受的答案[這裏]的第一個選項(http://stackoverflow.com/questions/2161054/where-to-place-configuration-properties-files-in-a-jsp-servlet-web -應用)。通過使用來自外部文件的資源加載,只需要在你的類路徑中可用,我認爲你可以實現你想要的。 – gamliela 2012-07-18 16:28:56

+0

我知道你至少可以引用HOME env變量如下$ {user.home} - > 不確定這是否有用,但可能以創造性的方式使用它。 請參閱[SSL HOWTO](http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html)有一個 – nsof 2011-02-08 21:38:10

回答

11

我想你不想使用環境變量(我認爲不能從web.xml中訪問),但環境 [12。像這樣:

<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應用程序是生成的代碼,我寧願不要,除了在web.xml中更改特定變量的值。所以我正在尋找一種方法來設置參考預設環境變量的值。 – 2009-09-12 21:03:48

+0

正如我所說:我認爲不可能在部署描述符中使用環境變量。沒有辦法改變一些代碼,恐怕。 – 2009-09-13 13:54:35

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風格的變量替換任何Tomcat的XML配置文件,如:

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

fooJava 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/> bean,然後直接使用envvars中或sysprops在Spring XML配置文件(儘管不是web.xml)。

+0

我使用Tomcat 7進行了測試,它適用於我。但它是否便攜?或者是特定於Tomcat? – mcoolive 2015-12-16 16:51:29

+0

你可以擴展如何使用property-placeholder在web.xml中使用envvars嗎? – Adam 2016-02-23 22:03:24

+0

@Adam我不認爲你可以在web.xml中使用property-placeholder,只能在我看到的spring config xml文件 – 2016-02-23 22:20:32

1

我不是你的限制完全清楚,但只是也許,你可以做到這一點(我假設這是你要配置一個init-PARAM):

1)發表的不確定變量在web.xml
2)創建的ServletContextListener並添加到您的應用程序
3)聽你的servlet
4)設置在init-參數有關該servlet在這一點上

的初始化我嘗試這樣做與類似的問題,但它失敗了,因爲它原來,第三方servlet(我也不想混淆)實際上並沒有充當servlet,所以上下文從未被初始化。但也許有機會在這裏...

1

你必須把將env-entry依次是:

<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