本文記錄項目部署過程,邊做邊記錄,邏輯可能不太順。
一、服務器准備
// 未做這部分操作,直接用的已有環境,jetty和tomact也是直接從其他服務器上復制的壓縮包解壓就用的
服務器環境搭建、工具安裝....(如windows/Linux、tomcat、jetty、mysql.....)
二、DB整理
1、本地連接服務器DB
打開Navicat(或SQLyog),點擊“連接”打開新建連接界面:
2、DB遷移
- 在服務器上新建一個DB
- 將開發時用的DB遷移到服務器上,需要對DB表進行整理 —— 保留需要的表,保留某些表需要的初始數據,不需要的一律清理掉。
三、項目打包
1、從 git 上取項目最新代碼
【加載項目依賴,如 #npm install 、maven update等】
2、修改項目配置(版本號、DB連接等),備份本次配置文件
- 前端:
如 /config/prod.env.js: 把開發時用的IP改成服務器IP
module.exports = merge(prodEnv, { NODE_ENV: '"development"', BASE_API: '"http://部署后台的服務器IP:端口號"', WS_BASE_URL: '"ws://部署前端的服務器IP:端口號"' })
注意:不能用本地localhost或者127.0.0.1,因為當客戶端在訪問服務器前端項目時,會把打包好的包全部導入客戶端本機(因為相當於靜態資源了,那時候讀取的 localhost 就不是服務器,而是請求服務器的客戶端本機了。)
- 后台:
pom.xml: 修改版本號,將 <version>0.1.7-alpha</version> 改為 <version>0.1.8-alpha</version>
nedbp.ds.conf.js: 修改數據庫連接。改成服務器上配置的DB。即修改url,username,password。
3、打war 包
- 前端 vue-webpack 項目:
#npm run build
打包失敗報錯:
ERROR in static/js/0.2b8a753690da2cc50594.js from UglifyJs Unexpected token: punc (() [./~/element-ui/packages/col/src/col.js:24,0][static/js/0.2b8a753690da2cc50594.js:47057,10] ERROR in static/js/4.60a7fcad606a094e54fc.js from UglifyJs Unexpected token: punc (() [./~/element-ui/packages/col/src/col.js:24,0][static/js/4.60a7fcad606a094e54fc.js:1875,10] ERROR in static/js/7.2cc5e2f4dddd35f75507.js from UglifyJs Unexpected token: punc (() [./~/element-ui/packages/col/src/col.js:24,0][static/js/7.2cc5e2f4dddd35f75507.js:1327,10] ERROR in static/js/12.42ab5fab9d6091c32782.js from UglifyJs Unexpected token: punc (() [./~/element-ui/packages/col/src/col.js:24,0][static/js/12.42ab5fab9d6091c32782.js:1061,10] Build failed with errors.
>> 解決:修改 /build/webpack.base.conf.js
注意: '/node_modules/element-ui/src' 及 ‘/node_modules/element-ui/packages’ 中的 ‘element-ui’ 可能還有版本號,具體名稱對應node_modules目錄下的elment-ui目錄名。
參考的是:element-ui打包的坑爹之處 !!!必看三遍!!!
重打包:#npm run build ,打的包在項目根目錄的‘dist’目錄下,如下圖所示
- 后端 java-maven 項目:
>> 准備工作:
在打包前,先刪除上次打包發布編譯生成的class類文件等,避免發生此次改動未生效的情況。
主要是刪除項目中 “target/classes/" 以及 “src/main/webapp/WEB-INF/{classes,lib}”,不要刪除 WEB-INF 下的 web.xml!
>> 打開Maven Projects:
在IDEA中,選擇菜單工具 View/Tool Windows/Maven Projects,即可打開Maven Projects:
Maven Projects目錄結構如下圖所示:
clean后,再deploy,控制台出現“BUILD SUCCESS”即打包成功。
>> 找到 war包
- 打好的 war包會放在 target目錄下,包名是根據pom.xml 中的配置自動生成: ${artifactId}-${version}.war。
- 也可以在配置的 maven倉庫(pom.xml中配置)中去找打好的 war包:${url}/${groupId}/${artifactid}/${version}
直接復制 url 就可以在瀏覽器中訪問maven倉庫,再根據 groupId 去到對應的目錄(以點為分界符隔開目錄名,如<groupId>AAA.BBB.CCC</groupId>,那么就應該在url/AAA/BBB/CCC/下找),再根據 artifactId (項目名)找到項目目錄,那之下再根據版本號version找到本次發布的版本就行了,里面就有war包。
- 關於如何配置maven中央倉庫:
原文連接:
pom.xml中直接添加阿里雲Maven中央倉庫配置: http://www.違zui規dai違ma規.com/blog/3517822264314880.htm
四、war包部署到服務器
1、遠程連接服務器
可以遠程連接桌面,可以用WinSCP等連接服務器。
2、將war包放到對應的容器下:
- 復制一份 jetty 和 tomacat(壓縮包,解壓即可)到服務器(如“E:\deploy\newproject\jetty-admin“ 和 “E:\deploy\newproject\tomacat-web”);
- 后台:
將后台maven project打的war包從maven倉庫下載下來,放置到服務器"E:\deploy\newproject\jetty-admin\webapps\"下,並重命名為ROOT.war
>> 為什么改名為ROOT.war:以便外部通過 域名或IP +端口號訪問服務器該 newproject 項目時,不用再在url后追加參數(war包名)。如你的包為“A.war”,那么訪問地址就是“http://IP:port/A”,用“ROOT.war”就只需要輸入“http://IP:port”
打開webapps:
- 前端:
將前端npm run build打的包(在前端項目根目錄/dist/),放置到服務器“E:\deploy\newproject\tomacat-web\webapps\ROOT\”
打開webapps:
打開ROOT:
3、運行起來
- 前端 tomcat:
雙擊“startup.bat”’,啟動tomacat服務器。
- 后台 jetty:
打開cmd,轉到“"E:\deploy\newproject\jetty-admin\”,輸入以下命令啟動jetty:
>> #java -jar start.jar
>> 報錯:java.net.BindException: Address already in use: bind
>> 出錯原因: A.端口被其他應用占用; B.已經開啟了一個Tomcat
由於我之前都沒修改過 tomacat 或 jetty 的端口號,而它們默認的端口號都是8080,部署在同一台服務器上就造成了端口號沖突,即不能同時啟動這兩個服務。要滿足兩個服務都能啟動,需要修改 tomacat 或 jetty的端口號。
>> 解決:修改端口號,注意端口號不要和服務器上已有項目的端口號重復!!
停掉前端的tomcat服務器,修改E:\deploy\newproject\ tomcat-web\conf\ ???? 里面的端口號為8088,外部訪問時就瀏覽器地址欄就應該輸入“ IP:8088”
或者修改jetty端口號,然后修改前端包中的配置文件(修改static\ js\ app....里面部署好的的basePath、localhref)。
其它:
1、解壓war包
當 jetty 啟動 war包報錯時,可以去查看log 找錯(如報數據庫連接失敗),此時需要解壓打好的war包,查看代碼方便修改,重打包.....
但是war包用WinRAR是沒法解壓的,用360解壓工具倒是可以,我不想安裝其它工具,就把 ROOT.war 導入了虛擬機(centos7),用以下命令解壓即可:
#jar xvf ROOT.war
【maven project 解壓后的項目文件在 /WEB-INF/classes/ 目錄下,因為maven打包時會先把編譯好的文件放到 /WEB-INF/ 以及 targets/classes目錄下,所以在重打包前一定要將這兩個目錄的對應的文件給清理掉,不然很可能發生執行的版本還是上次的文件的情況。】
2、 復制文件夾及其下的所有文件到另一個文件夾
#cp -ri dir1 dir2 // 有重復文件要提示用戶確認是否覆蓋
#cp -rf dir1 dir2 // 不提示,直接覆蓋
參考資料:
1. Jetty使用教程(一)——開始使用Jetty(2.2.2)