需求
原本服務器上tomcat部署了一個javaweb項目在80端口,這次要部署另一個javaweb項目在8090端口,或者同時部署在同一端口不同目錄下。
解決方法
不同端口部署
不同端口部署我們需要修改Tomcat\conf路徑下的server.xml文件,復制一下原本
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Catalina2">
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina2" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps2"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
然后復制一份Tomcat目錄下的webapps目錄修改名字為你上面修改的appBase的值,同理復制一份Tomcat\conf目錄下的catalina文件改名為上面修改的name的值,然后把javaweb項目放入webapps2(appBase值)中,重啟Tomcat即可,Tomcat版本的差異會導致路徑下的文件不同,安裝版本和解壓版本也會有所不同,我用的是安裝版的Tomcat7。
同一端口不同路徑部署
同一端口部署就相對簡單了,只需要把javaweb項目導出的.war文件放入Tomcat路徑下的webapps下重啟Tomcat即可。
默認訪問
更改上文中的server.xml文件,在Host標簽中加入Context path="" docBase="你的項目的絕對路徑"即可,示例如下。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="" docBase="C:\Tomcat\webapps\dwsurvey" />
</Host>
遇到的問題
亂碼
部署成功之后訪問頁面發現頁面中文亂碼,大概可能是三個方面出現問題,若果不能確定的話可以挨個修改排查。
工程編碼
修改eclipse項目的編碼為UTF-8

Tomcat編碼
修改server.xml中的 Connector標簽,增加屬性URIEncoding="UTF-8",示例如下。
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="20000" URIEncoding="UTF-8"
redirectPort="8443" />
數據庫編碼
我用的是Mysql,刪除掉之前導入的數據庫(drop databse “數據庫名”)執行以下命令重新創建數據庫
CREATE DATABASE `mydatabase` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
然后用source命令重新導入數據庫,登陸之后先用use命令選擇數據庫,然后source sql文件的絕對路徑就能成功導入了。
內存泄露
成功啟動Tomcat訪問項目的時候,Tomcat卡死,查看Tomcat\logs文件下的日志發現錯誤
Exception in thread "http-bio-8090-exec-8" java.lang.OutOfMemoryError: PermGen space,
查詢得知是因為JVM內存大小設置不當,加大即可。
免安裝版本的Tomcat可以修改Tomcat\bin目錄下的catalina.bat文件在“echo "Using CATALINA_BASE: $CATALINA_BASE"”(大概在130+行)上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m" 。
安裝版本bin目錄下沒有catalina.bat文件所以修改注冊表Win+R 輸入regedit打開注冊表 。
32位OS打開HKEY_LOCAL_MACHINE -> SOFTWARE -> Apache Software Fundation -> Procrun2.0 -> Tomcat7 -> Parameters -> Java -> Options
64位OS打開HKEY_LOCAL_MACHINE -> SOFTWARE -> WOw6432Node -> Apache Software Fundation -> Procrun2.0 -> Tomcat7 -> Parameters -> Java -> Option
在最后加上:
-XX:PermSize=128m
-XX:MaxPermSize=512m
無法打開文件
項目運行報錯,找不到數據庫表,經過老師幫助查看日志發現一個路徑很長的XLS文件無法打開,此文件是配置數據庫映射關系的,懷疑是路徑過深的問題,安裝Tomcat到C盤根目錄解決。
這樣好暴力啊
IIS占用80端口
因為用的是Windows Server所以自帶了IIS,考慮到之后可能會用到IIS,所以不徹底刪除,只是禁用在管理員命令行運行iisreset/stop,服務里禁用 world wide web publishing service(IIS)就行了,或者改變IIS的端口,這個錯誤耽擱了好久,因為瀏覽器的緩存,導致我改好了還是會顯示IIS頁面,瀏覽器緩存害死人啊。
JDK環境變量
之前的項目用的是1.8,但是現在部署的項目必須是1.7,因為之前沒有經驗天真的以為把這倆都設置成環境變量就萬事大吉了,結果1.7的項目報錯,經查詢原因是因為JDK版本,測試之后發現在1.7環境下之前的項目依然可以運行。所以刪除1.8環境變量,cmd java -version 結果還是1.8,當時我仿佛見了鬼,氣得我刪除了1.8,然后繼續java -version,結果輸出找不到1.8,找不到你還找個頭! 又查了一圈,說是可能寫入了注冊表,操作了一番發現並不是。最后我只好使出絕招 where java,然后在某Oracle路徑下發現了一系列以java.exe為首的文件,一看環境變量,原來Oracle目錄在環境變量里,但是有這個java.exe為什么會顯示找不到呢,百度之后發現原來這個java.exe是一個鏈接文件相當於一個快捷方式,我把本體刪了他自然就找不到了,刪除這幾個文件再次java -version 成功!
總結
這次部署耗費了我一天的時間,總結起來的錯誤看起來不難解決,但是遇到的時候還是要到處查,尤其是瀏覽器緩存已經吃過很多次虧了,總結錯誤就會更加熟練。你怎么這么熟練啊.jpg
雖然部署的問題解決了,項目的問題還是不斷。

