1. 程式人生 > >Maven 專案管理從未如此通暢

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包,然後下載到本地倉庫,以便下次使用。如果沒有私服,就直接去中央倉庫獲取。

  先說這麼多,後續再補。