這幾天是被java的環境搞瘋了,我先是搭了一個spring+springmvc+mybatis的工程,在家里跑了一下,沒有問題,把工程帶到公司里用,卻一直不能使用。
按常理來說,只要工程發生一點變化,tomcat都會自動重啟,自動重新reload。但是我發現我在公司無論怎么改,tomcat沒有一點變化,都是之前的工程狀態。
原因是因為之前,我把Build Automaticlly給去掉了。導致了eclipse不能及時的把編譯文件build到指定目錄中去。
勾上了就能同步上去了。
后來,我想了一下,它是怎么樣同步,根據什么來同步的呢?
選中工程右鍵選擇properties,找到
,
Deployment Assembly(部署裝配),這里是真正的部署到tomcat的工程。還有一個目錄java Build Path
這里有一個output folder文件選項,這里下面的目錄也是動態編譯的。但是這個classes文件夾在工程中是隱藏的。
在Deployment Assembly 和build Path中的輸出文件夾中classes目錄是同步 ,但是tomcat實際實際裝載的是Deployment Assembly 下面的文件。
打開一個文件夾就可以證明這個問題:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\datag\WEB-INF\classes\
這個目錄是tomcat實際裝載WEB項目的目錄。正好與Deployment Assembly的目錄對等。
但是后來我奇葩地發現target下面也有一個datag\WEB-INF\classes\目錄,天真的我以為tomcat裝載的是它,然而,當我對一個類文件作了修改之后,我發現target下面的個datag\WEB-INF\classes\下的對應的class文件的時間並沒有改變,這說明雖然文件已經編譯build但是並沒有build到這個目錄。然而我發現target\classes和\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\datag\WEB-INF\classes\下對應的class文件的修改時間改變了。
現在問題很明朗了,當勾上Build Automaticlly,當類文件發生一點變化,eclipse都會動態編譯,然后build到Deployment Assembly和build Path下設置的輸出目錄,我這里對應的是\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\datag\WEB-INF\classes\和target\classes,而tomcat最終執行的是Deployment Assembly下的目錄,緊接着,tomcat就會自動reload工程。
這里還有一個小小的問題target \datag\WEB-INF\classes的目錄是哪里來的呢,而且還不會動態更新?
其實這個是maven的產物,我勒個去,你執行maven install就知道了,(我的工程的名字叫datag)
這句話是在控制台輸出的。
target \datag\WEB-INF\classes是maven的產物,當然是不會動態更新了,只要當執行maven重新打包的命令的時候,里面的工程才能更新過來。