Maven 專案管理從未如此通暢
一,寫在前面
Maven到底是什麼?它能做些什麼?能為我們的開發工作提供什麼樣的幫助?為什麼會有如此大的知名度?另外,常聽大廠的人說“私服”,工具管理吧啦吧啦的一堆也是不明覺厲。相信仁者見仁,著智者見智了。鄙人不才,整理了一下之前的筆記,與諸君分享,值當飯後茶點,歡迎指點。
二,場景模擬
情景一:日常開發中,比如做資料庫操作,我需要引入諸如一下的jar包:
程式編譯的時候,各種陰差陽錯,會出現“ClassNotFoundException”,何解?唯有各種排查,也是比較鬧心卻也司空見慣了。
情景二:有過.net開發的人知道,比如,經常出現膈應的Newtonsoft.Json找不到的尷尬,此時只能從Nuget重新獲取,或者從別處引用,那麼會引起情景三。
情景三:現在的開發工作分模組,分功能,分業務,分流程等的開發模式,程式猿A在一處引入某jar包,程式猿B在另出引入該jar包,這樣會造成程式碼的混亂和冗餘。
情景四:我現在開發兩個java專案A和B,其中專案A中的一些功能依賴於專案B中的某些類,也就是說專案A的執行,必須靠引入專案B打包後的jar檔案才能執行。如果,專案B出現bug,那麼A必須重新引入新的B的jar包。假設已經是線上專案,會不會顯得被動了呢?!
總結,手動的新增刪除jar包,而引發各種“血案”。
三,說說Maven
什麼是架構?一個專案的整體架構的健全性,為專案的基本功能,規定了類和物件如何建立,如何協作,提供必要的支援性工作。
關於Maven,看看百度百科的說法
不過,我還是喜歡網上有位大神總結“Maven的核心功能就是合理敘述專案間的依賴關係”。通俗的說,就是通過pom.xml檔案的配置獲取jar包,而不再是手動新增jar包。其次,提供一個標準,配置檔案不在雜亂無章,單元測試不再哪哪都是。
所有的Maven專案都包含著一個pom.xml,在這裡記錄著的<groupId><artifactId><version>等欄位,這些欄位在建立Maven專案時填寫,後期也可以手動更改,Maven會依據它們來定位到該專案,進而完成jar的自動指引。
Maven主要做兩件事:
統一管理jar包
統一開發規範於工具
四,說說pom.xml
pom.xml,這是Maven的核心配置檔案,pom全稱Project Object Model(專案物件模型),它描述的是整個Maven專案,或者說是Maven的描述檔案:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>crm</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> </dependencies> </project>
說說這幾個關鍵詞
1。groupId
公司或組織的名稱。一般groupId由三部分組成“[專案用途].[公司名].[專案名]”,比如com.alibaba.taobao
2。artifactId
專案名
3。version
所需要jar的版本。SNAPSHOT意為快照,說明該專案在開發中。
以上三個元素,是Maven專案的基本座標,非常厚重要。
4。packing
專案打包的型別,包括jar,war,rar,pom,ear,預設是jar
5。dependencies和dependency
簡單的說,這裡存放我們開發所需要的jar包。比如,上面的junit,表示我測試單元所引入的jar包。再如,Maven專案中提示找不到javax.sevlet.api,會通過在這裡新增依賴:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
6。properties
主要用來定義一些配置的屬性,比如編碼方式等
7。build
表示與構建相關的配置
<build> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.7</version> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8888</port> <maxIdleTime>30000</maxIdleTime> </connector> </connectors> <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version} </webAppSourceDirectory> <contextPath>/</contextPath> </configuration> </plugin> </plugins> </build>
五,Maven的倉庫
通過上面的pom.xml中配置,就能得到我開發中所需要的jar包,那麼問題來了,這些jar在哪裡,而我又怎麼拿到呢?
這就引入了Maven倉庫的概念。
Maven倉庫分三種:本地倉庫,第三方倉庫(私服),中央倉庫。
1.本地倉庫
Maven專案建立後,在本地會有一個目錄,在這裡存放著幾乎我所能用到的所有jar包,預設地址:$user.home/.m2/repository(我用mbp,cd usr/[電腦名]/.m2/ repository )。我也可以修改預設地址,通過Maven目錄下conf/setting.xml,修改localRepository欄位就行。
2.第三方倉庫
又稱內部中心倉庫,也叫私服。
一般由公司內部設立,只為本公司內部共享使用。它既可以作為公司內部構件協作和存檔,也可以作為公用類庫映象快取,減少外部訪問和下載的頻率。所以,對私服安全性問題要求非常的嚴格,需要單獨配置,不然不能使用。
3.中央倉庫
這是由Maven團隊維護,裡面大約有1億個常用類庫,包括了市面大部分開源專案的構件,任你挑選。
總結,Maven專案獲取jar包的過程
優先會從本地倉庫查詢jar包,如果沒有,但是配置了私服,就會請求私服,從私服裡獲取jar,如果沒有,就會從中央倉庫裡獲取,直到找到對應jar包,然後下載到本地倉庫,以便下次使用。如果沒有私服,就直接去中央倉庫獲取。
先說這麼多,後續再補。