在開發JavaWeb應用時,為了實現配置分離,我們有時候需要在CLASSPATH中設定的設定檔的路徑。
但是在使用Intellij idea時發現發現設定的CLASSPATH不生效。
嘗試過的方法:
1.在intellij idea 項目中的module中添加
2.在Windows --我的電腦--屬性--進階系統變數裡設定CLASSPATH
都沒有效果。
找了許久的原因,偶然發現原來建立Tomcat server時 指定的是 自己的tomcat版本;所以在intellij idea啟動時載入的CLASSPATH時,是載入本地的tomcat中的CLASSPATH;而本地的CLASSPATH又是catalina.bat中設定的。所以我們需要更改intellij IDEA使用的本地的Catalina.bat 或者Catania.sh 檔案
修改前--intellij idea output:
:\apache\apache-tomcat-7.0.84\bin\catalina.bat run[2018-03-30 06:58:40,011] Artifact boss:war exploded: Waiting for server connection to start artifact deployment...Using CATALINA_BASE: "C:\Users\mingj\.IntelliJIdea2017.3\system\tomcat\Unnamed_pay_2"Using CATALINA_HOME: "D:\apache\apache-tomcat-7.0.84"Using CATALINA_TMPDIR: "D:\apache\apache-tomcat-7.0.84\temp"Using JRE_HOME: "D:\Program Files\Java\jdk1.7.0_80"Using CLASSPATH: "D:\apache\apache-tomcat-7.0.84\bin\bootstrap.jar;D:\apache\apache-tomcat-7.0.84\bin\tomcat-juli.jar"Connected to the target VM, address: '127.0.0.1:57543', transport: 'socket'2018-03-30 18:58:41 JRebel: Contacting myJRebel server ..
修改後--intellij idea output:
D:\apache\apache-tomcat-7.0.84\bin\catalina.bat run[2018-03-30 06:58:40,011] Artifact boss:war exploded: Waiting for server connection to start artifact deployment...Using CATALINA_BASE: "C:\Users\mingj\.IntelliJIdea2017.3\system\tomcat\Unnamed_pay_2"Using CATALINA_HOME: "D:\apache\apache-tomcat-7.0.84"Using CATALINA_TMPDIR: "D:\apache\apache-tomcat-7.0.84\temp"Using JRE_HOME: "D:\Program Files\Java\jdk1.7.0_80"Using CLASSPATH: "D:\apache\apache-tomcat-7.0.84\bin\bootstrap.jar ;d:\pay_conf/;D:\apache\apache-tomcat-7.0.84\bin\tomcat-juli.jar"Connected to the target VM, address: '127.0.0.1:57543', transport: 'socket'2018-03-30 18:58:41 JRebel: Contacting myJRebel server ..
觀察catalina.bat,發現catalina設定CLASSPATH時會先找setenv.bat(屬於使用者自訂屬性檔案) 然後再找setclasspath.bat(屬於java environment屬性檔案),我們直接在這兩者的後面(加粗標紅處)添加我們定義的屬性可以了。
set CLASSPATH=rem Get standard environment variablesif not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHomecall "%CATALINA_BASE%\bin\setenv.bat"goto setenvDone:checkSetenvHomeif exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat":setenvDonerem Get standard Java environment variablesif exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspathecho Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"echo This file is needed to run this programgoto end:okSetclasspathcall "%CATALINA_HOME%\bin\setclasspath.bat" %1if errorlevel 1 goto endrem Add on extra jar file to CLASSPATHrem Note that there are no quotes as we do not want to introduce randomrem quotes into the CLASSPATHif "%CLASSPATH%" == "" goto emptyClasspathset "CLASSPATH=%CLASSPATH%;":emptyClasspathset "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"rem 設定自訂屬性檔案set "CLASSPATH=%CLASSPATH% ;d:\pay_conf\ "if not "%CATALINA_TMPDIR%" == "" goto gotTmpdirset "CATALINA_TMPDIR=%CATALINA_BASE%\temp":gotTmpdir
這樣,如果在系統中有通過class.getClassLoader().getResourceAsStream(resource)直接就能讀取到設定檔了。
當使用spring載入設定檔時需要注意的是:我們通常使用PropertyPlaceholderConfigurer載入設定檔,這個地方需要設定 來指引spring 去系統的環境變數裡面尋找相同名稱的設定檔,才能找得到。
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
具體配置如下:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="ignoreResourceNotFound" value="true"/><property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /><property name="locations"><list><value>classpath:system.properties</value><value>classpath:redis.properties</value></list></property></bean>
bingo!