MAVEN 學習筆記

1、MAVEN是什麼?

maven將本身定位爲一個項目管理工具。它負責管理項目開發過程當中的幾乎全部的東西:java

  •     版本——maven有本身的版本定義和規則
  •     構建——maven支持許多種的應用程序類型,對於每一種支持的應用程序類型都定義好了一組構建規則和工具集。
  •     輸出物管理——maven能夠管理項目構建的產物,並將其加入到用戶庫中。這個功能能夠用於項目組和其餘部門之間的交付行爲。
  •     依賴關係——maven對依賴關係的特性進行細緻的分析和劃分,避免開發過程當中的依賴混亂和相互污染行爲
  •     文檔和構建結果——maven的site命令支持各類文檔信息的發佈,包括構建過程的各類輸出,javadoc,產品文檔等。
  •     項目關係——一個大型的項目一般有幾個小項目或者模塊組成,用maven能夠很方便地管理
  •     移植性管理——maven能夠針對不一樣的開發場景,輸出不一樣種類的輸出結果。

2、maven目錄結構

所謂的"約定優於配置",在maven中並非徹底不能夠修改的,他們只是一些配置的默認值而已。可是使用者除非必要,並不須要去修改那些約定內容。maven默認的文件存放結構以下:web

|/項目目錄
|----pom.xml           				//用於maven的配置文件
     |----/src                                  	//源代碼目錄
           |---- /main 				//工程源代碼目錄
               	 |----/java 				//工程java源代碼目錄
                 |----/resource 			//工程的資源目錄
           |----/test 				//單元測試目錄
                 |----/java
     |----/target 					//輸出目錄,全部的輸出物都存放在這個目錄下
           |----/classes 				//編譯以後的class文件

3、多項目管理

|---總項目/
     |---pom.xml 總項目的pom配置文件
     |---子項目1/
          |---pom.xml 子項目1的pom文件
     |---子項目2/
          |---pom.xml 子項目2的pom文件

注:在總項目中的<packaging>爲pom,而且須要設置使用<modules>來設置他的子項目spring

在總項目中加入apache

<modules> 
    <module>sub-module1</module> 
    <module>sub-module2</module> 
</modules>

其次在每一個子項目中加入windows

<parent> 
    <groupId>parent.groupId</groupId> 
    <artifactId>sub-module1</artifactId> 
    <version>1.0</version> 
</parent>   

4、maven的版本規範

maven使用以下幾個要素來惟必定位某一個輸出物: groupId:artifactId:packaging:version tomcat

  • groupId     團體,公司,小組,組織,項目,或者其它團體。團體標識的約定是,它以建立這個項目的組織名稱的逆向域名(reverse domain name)開頭。來自Sonatype的項目有一個以com.sonatype開頭的groupId,而Apache Software的項目有以org.apache開頭的groupId。
  • artifactId    在groupId下的表示一個單獨項目的惟一標識符。好比咱們的tomcat, commons等。不要在artifactId中包含點號(.)。
  • version     一個項目的特定版本。發佈的項目有一個固定的版本標識來指向該項目的某一個特定的版本。而正在開發中的項目能夠用一個特殊的標識,這種標識給版本加上一個"SNAPSHOT"的標記。   雖然項目的打包格式也是Maven座標的重要組成部分,可是它不是項目惟一標識符的一個部分。一個項目的 groupId:artifactId:version使之成爲一個獨一無二的項目;你不能同時有一個擁有一樣的groupId, artifactId和version標識的項目。
  •     packaging    項目的類型,默認是jar,描述了項目打包後的輸出。類型爲jar的項目產生一個JAR文件,類型爲war的項目產生一個web應用。

5、依賴管理

任意一個外部依賴說明包含以下幾個要素:groupId, artifactId, version, scope, type, optional。其中前3個是必須的,各自含義以下:服務器

  •     groupId 必須
  •     artifactId 必須
  •     version 必須。 
  •     這裏的version能夠用區間表達式來表示,好比(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多個條件之間用逗號分隔,好比[1,3),[5,7]。
  •     scope 做用域限制
  •     type 通常在pom引用依賴時候出現,其餘時候不用
  •     optional 是否可選依賴

在maven中,scope包含以下的取值:dom

  1. compile(編譯範圍)  compile是默認的範圍;若是沒有提供一個範圍,那該依賴的範圍就是編譯範圍。編譯範圍依賴在全部的classpath中可用,同時它們也會被打包。
  2. provided(已提供範圍)   provided依賴只有在當JDK或者一個容器已提供該依賴以後才使用。例如,若是你開發了一個web應用,你可能在編譯classpath中須要可用的Servlet API來編譯一個servlet,可是你不會想要在打包好的WAR中包含這個Servlet API;這個Servlet API JAR由你的應用服務器或者servlet容器提供。已提供範圍的依賴在編譯classpath(不是運行時)可用。它們不是傳遞性的,也不會被打包。
  3. runtime(運行時範圍)    runtime依賴在運行和測試系統的時候須要,但在編譯的時候不須要。好比,你可能在編譯的時候只須要JDBC API JAR,而只有在運行的時候才須要JDBC驅動實現。
  4.  test(測試範圍)   test範圍依賴 在通常的 編譯和運行時都不須要,它們只有在測試編譯和測試運行階段可用。測試範圍依賴在以前的???中介紹過。
  5.  system(系統範圍) system範圍依賴與provided相似,可是你必須顯式的提供一個對於本地系統中JAR文件的路徑。這麼作是爲了容許基於本地對象編譯,而這些對象是系統類庫的一部分。這樣的構件應該是一直可用的,Maven也不會在倉庫中去尋找它。 若是你將一個依賴範圍設置成系統範圍,你必須同時提供一個systemPath元素 。注意該範圍是不推薦使用的(你應該一直儘可能去從公共或定製的Maven倉庫中引用依賴)。

6、屬性

經過在<properties>設置屬性,在後面能夠經過${}來直接使用,以下面例子中的配置,就能夠方便管理spring的統一版本號maven

<properties>

<spring.version>4.3.1.RELEASE</spring.version>

</properties>




<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>${spring.version}</version>

</dependency>

maven提供了三個隱式的變量,用來訪問系統環境變量、POM信息和maven的settings:ide

  •     env     暴露操做系統的環境變量,好比env.PATH
  •     project     暴露POM中的內容,用點號(.)的路徑來引用POM元素的值,好比${project.artifactId}。另外,java的系統屬性好比user.dir等,也暴露在這裏。
  •     settings     暴露maven的settings的信息,也能夠用點號(.)來引用。maven把系統配置文件存放在maven的安裝目錄中,把用戶相關的配置文件存放在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。

7、PROFILE

profile是maven的一個重要特性,它可讓maven可以自動適應外部的環境變化,好比同一個項目,在開發環境和線上環境使用不一樣的配置文件,則能夠

<profiles>

<profiles>
        <profile>
            <id>local</id>
            <properties>
                <package.environment>local</package.environment>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>online</id>
            <properties>
                <package.environment>online</package.environment>
            </properties>
        </profile>
    </profiles>

這樣在打包配置文件的時候使用

<build>
    <resources>
        <resource>
            <directory>${package.environment}</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
     </resources>
<build>

就能夠針對不一樣的profile打包不一樣的配置文件

8、其餘配置

1.exclusion

若是咱們引入一個依賴A,但不想依賴A所依賴B,則可使用<exclusion> 

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>

2.使用指定jdk版本編譯,經過使用插件

<project> 
    ... 
    <build> 
        ... 
        <plugins> 
            <plugin> 
                <artifactId>maven-compiler-plugin</artifactId> 
                <configuration> 
                    <source>1.5</source> 
                    <target>1.5</target> 
                </configuration> 
            </plugin> 
        </plugins> 
        ... 
    </build> 
    ... 
</project>

3.目錄是非標準的目錄結構,如何設置讓maven支持

<build> 
    <directory>target</directory> 
    <sourceDirectory>src</sourceDirectory> 
    <scriptSourceDirectory>js/scripts</scriptSourceDirectory> 
    <testSourceDirectory>test</testSourceDirectory> 
    <outputDirectory>bin</outputDirectory> 
    <testOutputDirectory>bin</testOutputDirectory> 
</build>

4.源代碼是UTF8格式

<project> 
    ... 
    <properties> 
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    ... 
</project>

5.工程的全部依賴的jar都一塊兒打包

<build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>

而後使用命令打包便可:mvn assembly:assembly

6.多個源代碼目錄

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/config/java</source>
                <source>src/main/java</source>
                <source>src/member/java</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>