Intellij IDEA Tomcat設置CLASSPATH 不生效 配置分離實現

在開發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 variables
if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
call "%CATALINA_BASE%\bin\setenv.bat"
goto setenvDone
:checkSetenvHome
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
:setenvDone


rem Get standard Java environment variables
if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
echo This file is needed to run this program
goto end
:okSetclasspath
call "%CATALINA_HOME%\bin\setclasspath.bat" %1
if errorlevel 1 goto end


rem Add on extra jar file to CLASSPATH
rem Note that there are no quotes as we do not want to introduce random
rem quotes into the CLASSPATH
if "%CLASSPATH%" == "" goto emptyClasspath
set "CLASSPATH=%CLASSPATH%;"
:emptyClasspath
set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"

rem 設置自定義屬性文件
set "CLASSPATH=%CLASSPATH% ;d:\pay_conf\ "


if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
set "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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章