2011-05-24 25 views
1

這涉及到這樣的回答: System.getProperty("catalina.base") There can be scenario where client may use any other server正在使用虛擬機參數進行servlet配置'clean'?

另一臺服務器,獨立的系統 屬性自己,你可以設置爲VM 說法。

-Dconfig.location = /路徑/到/文件夾

在Tomcat的情況下,你可以將其設置爲 JAVA_OPTS環境變量,或 編輯catalina.bat中啓動文件或 編輯Windows服務設置 (當它安裝爲Windows 服務)等。其他服務器也支持 類似的結構。

這是否被認爲是「乾淨的」?我們已經這麼做了很多年,只是想知道這是否可以接受,或者有更好的方法來配置運行時環境。

+0

向回答者:請注意,該鏈接的問題指出屬性必須是不重建WAR修改。否則'''確實是一個非常明顯的選擇。 – BalusC 2011-05-25 11:06:13

+0

@BalusC。所以,這是一個好的選擇?只是問,因爲它總是對我來說似乎是一個黑客。但有時如果它起作用,它就會起作用。 – 2011-05-25 11:25:29

+0

這感覺可能是骯髒的,但除了把它放在類路徑中真的沒有更好的方法,如果需要解除WAR,只要你想改變外部配置文件的位置(不是我所知道的,已經回答了它:))。 – BalusC 2011-05-25 11:27:50

回答

1

這感覺可能是髒的,但是除了將它放入類路徑之外,如果要求在任何時候想要更改外部配置文件的位置時解除WAR,則真的沒有更好的方法。

如果對WAR沒有嚴格要求,並且允許重新構建WAR(例如,您正在使用內部開發的應用程序,並且持續集成並且serveradmins在同一行中),那麼您還可以使用<context-param>改爲web.xml

<context-param> 
    <param-name>config.location<param-name> 
    <param-value>/path/to/file</param-value> 
</context-param> 

它當時在任何Servlet(或更好,ServletContextListener)可通過ServletContext#getInitParameter()

String configLocation = servletContext.getInitParameter("config.location"); 
File configFile = new File(configLocation, "config.properties"); 
// ... 
1

我的理解是,「更乾淨」將在web.xml中使用 <servlet-param> <init-param>或某種類型的IoC解決方案,如Spring。

+1

web.xml自定義適用於應用程序的靜態調整。但是,因爲它是在編譯時生成的,並且在很多情況下都埋在.war內,所以對於最後一分鐘的運行時配置更改並不理想。 – 2011-05-24 19:47:07

+0

@Alexander,你可以使用兩者,你​​可以依賴系統支撐(它們也可以動態地改變)和init-param。 init-param優先(如果缺少,則使用system-prop) – bestsss 2011-05-25 07:47:13

+0

我會用''代替,但這並不能真正**回答問題。要求是能夠解除WAR。 – BalusC 2011-05-25 11:06:52

1

我覺得這不是最簡單的方法來達到你想要的。您可以使用web.xml init params或servlet params標籤。
另一種方法是使用屬性文件或XML配置文件。

+0

這需要重新構建Web應用程序,只要您想更改位置即可。這在原始問題的情況下是不希望的。 – BalusC 2011-05-25 11:03:44

+0

有屬性文件的重點不是重建應用程序。它只需要重新啓動服務器。另一方面,如果您不想重新啓動服務器,則可以在數據庫中維護值。 – Sid 2011-05-25 16:14:59

0

具有系統屬性的缺點是需要重新啓動容器才能修改系統參數。

將它作爲web.xml中的init-param,可以讓您通過重新啓動Web應用程序進行修改。

在init-param中有一個更好的方法。

+0

這需要重建webapp,只要你想改變位置。這在原始問題的情況下是不希望的。 – BalusC 2011-05-25 11:04:34

1

我只是在一個稍微不同的方式解決類似的問題。我們的客戶希望配置數據庫連接細節,集成服務器位置和端口等,而無需重建戰爭。使用環境屬性來指向包含信息的外部文件可能會也可能不會,但它感覺有點骯髒。無論如何,這是一個稍微更企業的方式。

對於數據庫連接,我們使用JNDI查找,下面是集成服務器參數化的當前解決方案。參數可以來自至少三個不同的來源:

  1. 屬性文件,它可以用Maven配置文件覆蓋,並且需要在彈簧配置中可以訪問單行xml。這顯然是在戰爭文件裏面。
  2. web.xml上下文參數。當然,這也是在戰爭檔案中。
  3. Tomcat服務器可以用context.xml覆蓋init參數,這可以在戰爭之外。這恰好是定義JNDI上下文的文件,這很好。

下面是配置accessor bean的實現。它可以運行在servlet上下文中,也可以不運行(對於某些單元測試,啓動一個完整的Web服務器沒什麼意義,但我們仍然需要滿足spring bean注入)。

我並不是說這是一個完美的解決方案,但它是一個。沒有找到像谷歌這樣的事情。

@Service 
public class IntegrationConfigurationImpl implements 
    IntegrationConfiguration, InitializingBean, 
    ServletContextAware, ApplicationContextAware { 

private static final String SERVER_HOST_PROPERTY = "integration.server.host"; 
private static final String SERVER_PORT_PROPERTY = "integration.server.port"; 
private static final String PROPERTY_BEAN_NAME = "integrationProperties"; 

private ServletContext servletContext; 
private ApplicationContext applicationContext; 

private static final Logger log = LoggerFactory.getLogger(IntegrationConfigurationImpl.class); 
private String serverHost = "foo"; 
private int serverPort = 42; 

@Override 
public String getServerHost() { 
    return serverHost; 
} 

@Override 
public int getServerPort() { 
    return serverPort; 
} 

@Override 
public void setServletContext(ServletContext servletContext) { 
    this.servletContext = servletContext; 
} 

@Override 
public void setApplicationContext(ApplicationContext applicationContext) { 
    this.applicationContext = applicationContext; 
} 

@Override 
public void afterPropertiesSet() throws Exception { 
    // konfiguraation validointi.. 
    if (servletContext == null) { 
     log.info("servlet context not set, not running as a web application. Trying to get properties from application context"); 
     if (applicationContext.containsBean(PROPERTY_BEAN_NAME)) { 
      Properties p = (Properties)applicationContext.getBean(PROPERTY_BEAN_NAME); 
      serverHost = p.getProperty(SERVER_HOST_PROPERTY); 
      serverPort = Integer.valueOf(p.getProperty(SERVER_PORT_PROPERTY)).intValue(); 
     } else { 
      log.info("Property bean not found :" + PROPERTY_BEAN_NAME); 
     } 
    } else { 
     serverHost = servletContext.getInitParameter(SERVER_HOST_PROPERTY); 
     serverPort = Integer.valueOf(servletContext.getInitParameter(SERVER_PORT_PROPERTY)).intValue(); 
    } 
    log.info("Using integration server " + getServerHost() + ", port " + getServerPort()); 
} 

}