我們在開發的時候習慣對於項目的框架進行分層,在idea中對於不同的層,我們使用module來進行划分,不同的module之間是通過maven來進行依賴的。
我們的項目結構是這樣的,admin是我們的war,里面含有controller,service和impl分開,admin依賴於service,這種情況下,我們使用jrebel來啟動。
第一種:使用jrebel來啟動
修改xml,生效
我們修改了xml中的sql語句是是如何熱部署的:
我們需要將service-impl重新進行clean install
我們回到debug的console來進行觀察,我們看到jrebel會自動部署我們新安裝的包,效果:
瀏覽器上面的網頁刷新發現我們需要重新登入:
有個問題:為什么沒有重新啟動服務器,而這里卻需要重新登入。
改變方法結構,無效
測試修改service中添加參數:
添加完成之后,發現controller中自動爆出錯誤:
impl中自動檢測出現錯誤:
如果我們只是保存之后,運行發現我們新添加的東西沒有起作用
我們對於service或者serviceImpl進行mvn clean install 發現不成功,這是因為我們的admin,是依賴於這兩個包的,我們無法再admin使用它們的時候,對於整個包進行操作。就是clean install,是不允許我們操作的。
修改方法內容,生效
修改admin中的controller,和修改serviceimpl中的方法,無需重啟。
使用Ctrl+F9進行編譯。
第二種情況,debug啟動
修改方法內容,生效
修改方法結構,無效
dao層:無效
修改接口中的方法結構:無效
編譯單個文件
上面我在修改單個方法結構之后覺得應該是響應的包沒有進行安裝的問題,所以我的修改沒有啟動作用,所以我在進行將war依賴的jar進行來重新的install,
編譯整個項目
重新installservice,然后在重新installadmin,
依賴包有更新,但是服務器中代碼仍然是執行的之前的代碼,也就是說我修改的代碼,重新打成了jar包放入了我們的war包中,但是war現在運行的代碼仍然是之前的代碼。(不明白為什么會有這種情況)
修改xml的sql語句,無效
將代碼修改正確之后,將admin中的war包重新打入正確語句的impl實現包之后:
發現我們的頁面任然限制之前的錯誤,證明新打的war包沒有在jetty插件中運行, 證明jetty插件可能不是熱部署war包的。重新啟動jetty之后,不做任何之前的修改,部署,發現我們的頁面正常訪問。證明救過,jetty不是熱部署war包的。
總結:
使用jetty插件中的jrebel來進行debug啟動的時候:
修改方法內容(controller和service)內容生效。
修改方法結構無效。
修改xml(sql語句)文件生效。
直接使用jetty進行dubug的時候:
修改方法內容(controller和service),生效。
修改方法結構(dao,和接口中的),無效。
修改xml(sql語句),無效。
問題:
在進行修改方法結構的時候,個人認為是因為我的war依賴於我的jar來運行的,我修改了jar之后,沒有重新打包放到war中所以我修改的代碼沒有起到作用,於是我在修改代碼之后進行重新install,發現我們war中的jar確實更新了,但是我們的jetty服務器中運行的代碼仍然是之前的代碼,如果我們沖新啟動我們的服務器,不做任何修改,發現我們修改的效果可以運行出來,不是很清楚這個是什么原因,是jetty插件的運行時,不能夠進行熱部署war嗎?