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內置了遠程公用倉庫,http://repo1.maven.org/maven2
這是由Maven團隊維護,裏面大約有1億個常用類庫,包括了市面大部分開源項目的構件,任你挑選。
總結,Maven項目獲取jar包的過程
優先會從本地倉庫查找jar包,如果沒有,但是配置了私服,就會請求私服,從私服裏獲取jar,如果沒有,就會從中央倉庫裏獲取,直到找到對應jar包,然後下載到本地倉庫,以便下次使用。如果沒有私服,就直接去中央倉庫獲取。
先說這麽多,後續再補。
Maven 項目管理從未如此通暢