昨天碰見個問題,maven打包多子產品的web項目。将spring的bean配置在遠端排程系統,排程系統通過發送排程指令到本地,本地通過線程池調用spring的bean。在service子產品打包的jar中,我需要儲存一些檔案到本地,因為不是通過web調用,是以擷取不到項目根目錄,當時也沒想到有什麼好辦法。是以就直接儲存到系統目錄,代碼做預判,目錄不存在就建立,在window下,建立目錄都沒有問題,但是部署到Linux下jboss中,碰見了使用者權限問題,這東西又不能怪人家系統,每次都找運維建立也不現實,估計人家都能煩死。後來在處理檔案的時候發現System.getProperty("file.separator")和System.getProperty("line.separator"),可以通過system擷取系統參數,是以就想也許可以通過提前将系統根目錄注入system,後面再擷取,悲劇,轉了一圈還得擷取系統根目錄。
說了一堆廢話還是看代碼吧:
web.xml:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>dp.root</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.WebAppRootListener
</listener-class>
</listener>
WebAppRootListener:
public classWebAppRootListener implements ServletContextListener {
public voidcontextInitialized(ServletContextEvent event) {
WebUtils.setWebAppRootSystemProperty(event.getServletContext());
}
public voidcontextDestroyed(ServletContextEvent event) {
WebUtils.removeWebAppRootSystemProperty(event.getServletContext());
}
}
WebUtils:
public static void setWebAppRootSystemProperty(ServletContextservletContext) throws IllegalStateException {
Assert.notNull(servletContext, "ServletContextmust not be null");
String root =servletContext.getRealPath("/");
if (root == null) {
throw newIllegalStateException(
"Cannot set web app root system property when WAR file is notexpanded");
}
String param =servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);
String key = (param != null ?param : DEFAULT_WEB_APP_ROOT_KEY);
String oldValue = System.getProperty(key);
if (oldValue != null&& !StringUtils.pathEquals(oldValue, root)) {
throw newIllegalStateException(
"Web app root system property already set to different value:'" +
key + "' = [" + oldValue + "] instead of [" + root +"] - " +
"Choose unique values for the 'webAppRootKey' context-param in yourweb.xml files!");
}
System.setProperty(key, root);
servletContext.log("Set web approot system property: '" + key + "' = [" + root + "]");
}
在bean的代碼中通過System.getProperty("dp.root")擷取系統參數。萬能的spring,感謝之。