首先簡單瞭解一下maven:html
平常開發中,咱們用到的maven相關功能大概如下幾種:
一、 管理jar依賴
二、 構建項目(打包、編譯等)
三、 發佈項目(共享、上傳至服務器,供他人使用)java
jar通常在pom.xml文件的中配置,以spring core爲例,通常格式以下:web
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.1.RELEASE</version> </dependency>
其中groupId通常爲項目(jar war pom等)的發佈機構名稱;
artifactId爲項目名稱;
version爲項目版本;
在項目編譯打包的時候,ide會自動到maven倉庫去查找相應的jar文件,打包並存放在項目的相應路徑下(如web項目的lib目錄下)
(關於依賴的各個名稱和寫法,請見後文:詳細說明–依賴說明)spring
這裏所說的構建項目主要指打包、編譯、運行測試用例等操做,即maven的生命週期中的打包過程。
最經常使用的就是compile了,通常項目修改代碼之後都要從新編譯,而後加載到tomcat中運行調試。
其它的還有clean、package等比較經常使用的操做,請見詳細說明–生命週期部分apache
若是咱們寫一些通用框架,或者本身封裝了一些常見的工具類,想要打包爲jar而且供他人使用,那麼咱們能夠經過maven發佈到公共倉庫(私服)供他人下載依賴使用。
好比每一個公司都會有本身的框架,持久層、控制層或者其它功能等。當咱們沒有使用maven的時候,咱們是直接把別人的jar拷貝到項目的library目錄下,而如今咱們有了maven就不用本身處處拷貝jar包了,只須要在發佈的時候找到別人發佈到倉庫時候寫的groupId artifactId version等信息就能直接添加依賴了,也就是至關於第一步的依賴管理。tomcat
maven實際上經過多模塊的思想來組織依賴的,每個項目或者jar都是一個模塊,咱們能夠把一些通用的,不常變更的東西寫在一些指定的模塊下,在另一個項目中引用依賴(這裏就有點相似【一、依賴管理】,這樣一來可讓項目結構更清晰、方便別人依賴使用,若是項目都是一個模板,也能夠複用等等,還有其它各類好得本身摸索感覺吧)安全
這裏要注意,在咱們本身發佈項目時儘可能遵照以上規範,不然當別人搜索依賴時會寫的很冗餘很混亂,這也是不少私服中不斷重複上傳相同jar會致使項目出錯的緣由。
正常來講,一個項目(如spring的jar)應該是機構、名稱和版本惟一的,當咱們引用時,能夠經過這三個參數惟一標識出一個項目,在上傳這些項目的時候,不少人喜歡在artifactId中寫上本該屬於groupId的內容,這實際上是不合理的。
舉個錯誤寫法例子:bash
<dependency> <groupId>org.springframework</groupId> <artifactId> org.springframework .spring-core</artifactId> <version>4.1.1.RELEASE</version> </dependency>
這裏在artifactId中重複定義了本該屬於groupId的內容,因此這樣對於項目發佈來講是不規範的。服務器
由於咱們安裝maven是要配置maven主程序目錄、maven配置文件目錄、maven倉庫目錄這三個路徑的(可能ide會有自動配置,但這三個都是必不可少的)
maven主程序也就是咱們下載的maven插件的根目錄;
maven配置文件路徑就在maven主程序目錄\conf\下,默認名爲setting.xml;
maven倉庫目錄也就是maven自動下載jar所存放的目錄以及咱們項目發佈的本地目錄。
當咱們編譯項目時通常會有以下過程:
1)編譯
2)找到pom文件,並掃描相關依賴
3)根據pom中依賴配置信息,到本地maven倉庫去查找jar包
4)若是本地沒有jar,maven會到它的中心倉庫下載jar(
1. http://www.sonatype.org/nexus/
2. http://mvnrepository.com/)
5)若是你公司建立了私服,而且你的maven中作了配置,那麼在本地沒有找到jar包時,會根據maven的配置文件(conf/setting.xml)所配置的地址,到maven的私服倉庫去尋找jar,私服也會根據它的配置規則在本地或中央倉庫查找jar,若是本地沒有就從服務端下載到本地。(私服的優勢見下文)網絡
在步驟1 中,編譯會將本地*.java編譯爲字節碼文件,其中不少jar依賴於第三方類庫,這時候IDE會根據已配置的 maven\conf\下的setting.xml文件中的配置(或IDE的maven倉庫路徑)去查找相應jar包。若是有jar包,則會拷貝到項目的編譯目錄下(myEclipse默認爲「tomcat\webapp\lib\」目錄下;Intellij IDEA 默認在「項目target\webapps\lib」目錄下),
若是本地沒有,那麼會先去倉庫下載到本地,再從本地拷貝到項目編譯目錄。
其它的下載過程最終也會下載到本地並拷貝到編譯目錄,更多詳情就很少解釋了,可自行學習。
maven將項目的生命週期大體分爲9個,分別爲:clean、validate、compile、test、package、verify、install、site、deploy
我常常用的也就是clean、compile、package、install、deploy,並且deploy相對也較少,由於不多發佈公共的項目供別人依賴使用,基本也就是項目打包爲war時候會打包到私服,運維人員能夠到私服上直接下載對應版本。
其中clean即清除項目中編譯文件和本地倉庫中已打包的文件(即本地install的文件,install後面講到)
compile即編譯項目中的java文件,並存放在項目的編譯目錄(根據不一樣的配置,編譯目錄也不同)
test 即運行項目中的測試用例文件,若是測試用例未經過,也會打包失敗,另,這裏的test過程能夠在pom中經過配置跳過。(想一想也是,我項目都好了,其實不是非要跑測試用例的)
package 即將本地編譯好的文件打包爲war 或者jar(這是最多見的兩種,其餘相關自行了解)
verify 我不多用到,沒怎麼了解過
install 將打包的代碼存放到本地maven倉庫,可供本地其它項目依賴使用
site生成項目報告,站點,發佈站點,這個也不多用到,不是很清楚
deploy 將打包在本地倉庫中的項目發不到服務器,供他人依賴使用
詳細生命週期自行學習瞭解。
maven在執行一個生命週期的命令的是時候將會執行以前的全部生命週期操做,好比執行mvn install,會執行前面一系列的動做包括 compile , package , test 等,具體請查看maven的官方文檔。這個特性使maven的命令更加簡潔易用。
在上述過程當中,私服的做用至關於本地的maven倉庫,但它同時又做爲服務器的角色來爲局域網用戶提供jar下載,在不少開發環境中,開發機器是不容許鏈接互聯網的,因此這時候maven就不能正常訪問中央倉庫下載jar文件,因此這裏的私服倉庫就顯得尤其重要了。私服所在服務器提供了同時訪問內網和互聯網的功能,當用戶找不到jar包依賴時,能夠經過內網訪問私服服務器,若是私服沒有,那麼私服會經過互聯網去中央倉庫或其它倉庫下載,這樣能夠必定程度上保證開發環境的安全性。
另外一方面局域網的訪問速度廣泛是比互聯網快的,若是在本地沒有jar,當局域網用戶下載jar包且私服沒有時,私服的帶寬比較大即可以更快速的下載到jar並回傳到開發者本地,這樣能夠保證在複雜的網絡環境或網絡不通暢的時候依然可使用maven相關的功能。而且,當局域網中有用戶下載了相應jar包後,其它用戶再次須要該jar包時私服倉庫即可以直接從私服服務器本地直接經過局域網發送給局域網用戶,這樣大大減小了帶寬、流量並解決了不少因爲網絡環境致使的問題。
因爲平時接觸的jar war比較多,文中不少地方對依賴或者項目打包都簡單以jar來講明,其實那些jar不單是指jar包文件,還能夠是war、pom、或者項目目錄結構打包的相關類型的文件,爲了便於理解暫用jar來講明,待知識體系再完善還會進一步修改哈。
一、 tomcat啓動:
IDEA 打包配置:
mvn clean package -DskipTests
或者
mvn clean package -Dmaven.test.skip=true
而後在有main方法的項目編譯後的target下main找到war包例如:ctuom-web-201803020954.war(須要修改成ctuom-web.war),而後把war包放在tomcat目錄的webapps下面解壓,
啓動tomcat下bin裏面的startup,訪問:http:localhost:8080/ctuom-web/ 就能夠訪問了
二、 在Springboot的應用的根目錄下運行mvn spring-boot:run
三、使用mvn install 生成jar後運行
先到項目根目錄
mvn install
cd target java -jar xxxx.jar