Maven筆記

Maven

Struts Spring MyBatis

做一個項目,首先需要各個jar包的下載,先到Struts 2官網下載Struts 2 jar包,在到Spring官網下載Spring jar包,還有MyBatis jar包,以及第三方的jar包。在項目還沒有開始的時候就已經有了很多的jar包,有用的,沒用的,版本衝突的,所以在這個時候出現了優秀的開源的項目管理。

Maven Antgradle優秀的項目管理


Maven快速入門————介紹及環境搭建

Maven是基於項目對象模型(POM),可以通過一小段描述信息來管理項目的構建、報告和文檔的軟件項目管理工具。

登錄官網https://maven.apache.org/,下載maven.bin的壓縮文件,下載後解壓打開。打開apache-maven-3.5.4下的bin文件夾,裏面有可以運行的mvn腳本,boot目錄包含了一個類加載器的框架,conf下是配置文件的目錄,lib下有所有的類庫。接下來配置環境變量。

右鍵我的電腦,屬性,選擇“高級系統設置”,點擊環境變量。在“系統變量”中新創建一個,名爲“M3_HOME”,變量值爲apache-maven-3.5.4的路徑。點擊Path,編輯“%M3_HOME%\bin”。點擊確定。打開終端,輸入“mvn -v”,即可查看電腦所有的信息,配置成功的話就可以看到maven的版本信息。

目錄結構

 

常用的構建命令介紹:
mvn -v 查看maven版本
    compile 編譯
    test 測試
    package 打包項目

    clean 刪除target
    install 安裝jar包到我們的目錄


自動創建目錄骨架:
archetype插件:用於創建符合maven規定的目錄骨架

maven規定:
src
    -main
        -java
            -主代碼(com.sycu.項目名.作者.包名)

src
    -test
        -測試代碼(用來進行測試)


創建目錄的兩種方式:
1、archetype:generate 按照提示進行選擇
2、archetype:generate -DgroupId=組織名,公司網址反寫+項目名
                    -DartifactId=項目名-模塊名
                    -Dversion=版本號
                    -Dpackage=代碼所存在的包名


maven中的座標和倉庫
    座標        構建
    所有的構建均通過座標作爲其唯一標識

    其中groupId、artifactId、version都是組成項目基本的座標

    倉庫:用來管理依賴,分成 本地倉庫 和 遠程倉庫 兩種

    maven爲我們提供了一個超級pom,在lib下maven-model-builder.XXX.jar中,這裏面的pom-XXX.XML,是所有的pom都會繼承這個pom

    maven全球中央倉庫的地址 url:https://repo.maven.apache.org/maven2

    鏡像倉庫:maven/conf/settings.xml
    第152行可以看到有mirror
    <mirror>
      <id>maven.net.cn</id>
      <mirrorOf>central</mirrorOf>//這裏可以指定倉庫名,也可以使用通配符 * 來匹配所有的鏡像,一旦配置鏡像,所有針對原倉庫的訪問都會轉到鏡像倉庫,那麼原倉庫就不能再繼續訪問
      <name>central mirror in china</name>
      <url>http://maven.net.cn/content/groups/public</url>
    </mirror>

    更改倉庫位置:
    maven從遠程倉庫下載 構建,默認是存放在當前的用戶目錄中 C:\Users\Administrator\.m2
    最好是不要存放在C盤中,要是重做系統,那麼這些數據就會消失
    在別的盤下創建一個文件夾repo,然後打開conf下的settings.xml文件,
    在53行出找到<localRepository>/path/to/local/repo</localRepository>,把他複製粘貼出來,修改成剛纔repo的文件夾路徑,同時把\替換成/,
    例如:<localRepository>D:/mavenworkspace/repo</localRepository>

    修改成功之後,把settings.xml文件複製到repo文件夾下,然後打開終端,進入到一個項目中,再次輸入mvn clean compile,敲回車就OK了。

在Eclipse中安裝maven插件以及創建maven項目
    到網站上下載插件,m2e  https://download.csdn.net/download/zk461759809/8817869
    下載好後放在安裝eclipse目錄下的dropins目錄下即可。
    然後打開安裝eclipse的文件夾,下面有一個eclipse.ini的文件,打開,在第11行下(也不一定),添加行輸入:
    -vm
    C:\Java\jdkXXXXXXX(安裝jdk的jdk下的bin文件夾路徑)\javaw.exe
    隨後打開eclipse->windows->Preferences
    點擊Java->Installed JREs。  在這裏要選擇jdk的安裝路徑
    點擊Maven->Installations。  點擊Add,選擇maven的安裝路徑,勾選中,ok
    點擊Maven->UserSettings。   User Settings下選擇repo下的settings.xml文件

    隨後創建一個maven項目,創建完成之後,打開pom.xml,可以發現跟我們之前寫的是一樣的。
    接着在pom.xml文件上右鍵,Run As -> Maven build...   再Goals中寫入compile就可以編譯,在控制檯上就可以看到有BUILD SUCCESS,這就完成搭建了。
    如果出現錯誤:-Dmaven.multiModuleProjectDirectory system propery is not set. XXXXXXXXXXXXXXXXXXXXXX,
    那麼打開eclipse->windows->Preferences->Java->Installed JREs,點擊jdk,edit,在Default VM arguments中寫入:-Dmaven.multiModuleProjectDirectory=$M3_HOME(自己配置的環境變量的名)



Maven的生命週期和插件                                                                                                                                                                        
    之前使用過clean、compile、test、package、install                                                                                               
    一個項目完整的構建過程包括:                                                                                                                                                    
        清理、編譯、測試、打包、集成測試、驗證、部署
    maven和插件密不可分:maven抽象出一套項目構建的生命週期。而插件是對抽象進行實現。
    maven中定義了三套生命週期:1、clean      清理項目
                            2、default     構建項目
                            3、site        生成項目站點
    這三套生命週期是相互獨立的,每個生命週期都包含一些階段,各個生命週期中的階段都是有順序的,且後面的階段依賴於前面的階段,執行某一個階段時,其前面的階段會順序執行,但不會觸發另外兩套生命週期的任何階段。

    clean清理項目
        pre-clean   執行清理前的工作
        clean       清理上一次構建生成的所有文件
        post-clean  執行清理後的文件

    default構建項目(最核心)
        compile test package install(最爲常用,不常用的還有很多)

    site生成項目站點
        pre-site     在生成項目站點前要完成的工作
        site         生成項目的站點文檔
        post-site    在生成項目站點後要完成的工作
        site-deploy  發佈生成的站點到服務器上    使用source插件:
    <build>
          <plugins>
              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-source-plugin</artifactId>
                  <version>2.4</version>
                  <executions>
                      <execution>
                          <phase>package</phase>
                          <goals>
                              <goal>jar-no-fork</goal>
                          </goals>
                      </execution>
                  </executions>
              </plugin>
          </plugins>
      </build>
      打包的時候系統會自動的進行測試以及打包
                                                                                                                                                                                          
pom.xml是項目的核心管理文件,用於描述、組織管理、依賴管理、構建信息的管理                                             
pom.xml包含了很多的標籤                                                                                                                                                                



!!!pom.xml常用的標籤!!!      |
<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">        
  <!-- 指定了當前pom的版本 -->                                                                                
  <modelVersion>4.0.0</modelVersion>                                                                        
                                                                                                              
  <!-- 項目標識,反寫的公司網址+項目名 -->                                                                        
  <groupId>com.imooc.hi</groupId>                                                                             
  <!-- 項目名+模塊名 -->                                                                                        
  <artifactId>hi</artifactId>
  <!-- 第一個0表示大版本號
          第二個0表示分支版本號
          第三個0表示小版本號
          0.0.1
          snapshot 快照
          alpha    內部測試
          beta     公測
          Release  穩定
          GA       正式發佈 -->
  <version>0.0.1-SNAPSHOT</version>
  <!-- 打包方式,默認是jar。
         還有 war zip pom-->
  <packaging>jar</packaging>

  <!-- 項目描述 -->
  <name>hi</name>
  <!-- 項目地址 -->
  <url>http://maven.apache.org</url>
  <!-- 
      項目描述
  <description></description>
      開發人員信息
  <developers></developers>
      許可證的信息
  <licenses></licenses>
      組織信息
  <organization></organization>
  -->
  
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- 依賴列表 -->
  <dependencies>
    <!-- 依賴項 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <!-- 依賴範圍 
              test是只有在test測試的範圍內有用-->
      <scope>test</scope>
      <!-- 設置依賴是否可選
              裏面有true和false
              默認是false
              子項目如果默認是false,子項目默認是繼承的
              如果是true,子項目必須寫入引用給依賴
      <optional></optional>
      
                  排除依賴傳遞的列表
      <exclusions>
        <exclusion>
        </exclusion>
      </exclusions>
      <
      -->
    </dependency>
  </dependencies>
  
  <!--
           依賴的管理
      <dependencyManagement>
          <dependencies>
              裏面有很多的依賴類表,但是並不會被運行,不會被引入到實際的依賴中。
              這個標籤一般是被定義在父模塊中的,供子模塊所繼承用的
          </dependencies>
      </dependencyManagement>
  -->
  
  <build>
    <!-- 插件的列表,可以包含多個plugin -->
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-source-plugin</artifactId>
              <version>2.4</version>
              <executions>
                  <execution>
                      <phase>package</phase>
                      <goals>
                          <goal>jar-no-fork</goal>
                      </goals>
                  </execution>
              </executions>                                                                                    
          </plugin>                                                                                            
      </plugins>                                                                                                
  </build>                                                                                                    
  <!-- 通常用於子模塊在父模塊中的pom的繼承                                                                        
  <parent></parent> -->                                                                                        
  <!-- 用來聚合多個的maven項,可以在module中指定多個模塊進行編譯                                                    
  <modules>                                                                                                   
      <module>                                                                                                
      </module>                                                                                                
  </modules> -->                                                                                            
</project>                                                                                                    



依賴範圍                                                                                                                                                
    <scope>test</scope>                                                                                                                                
    三種classpath:1、編譯 2、測試 3、運行                                                                                                                 

    6種scopes
    1、compile:如果沒有指定,那麼就默認的範圍,編譯測試運行都有效
    2、provided:在編譯和測試時有效,在最後運行的時候不會被加入
    3、runtime:在測試和運行時有效
    4、test:只在測試範圍內有效
    5、system:在編譯和測試時有效,因爲與本地相關聯,所以有很大的不可移植性
        可能將項目移動到別的電腦上,會因爲路徑不一致,而導致錯誤
    6、import:導入的範圍,他只是用在dependencyManagement中,表示從其他的pom中導入dependency的配置

依賴的傳遞
    在依賴列表中加入一個dependency
    <dependencies>
        <!-- 依賴項 -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          添加上要依賴的標識
          <groupId>com.imooc.XXX</groupId>
          <artifactId>XXX-XXX</artifactId>
          <version>0.0.1-SNAPSHOT</version>
        </dependency>
      </dependencies>
排除依賴
    如果C依賴於B,B依賴於A,那麼C就間接性的依賴於A
    但是現在不想讓C依賴於A,那麼就需要排除依賴
    在dependency依賴項中加入exclusions
    <dependencies>
        <!-- 依賴項 -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          添加上要依賴的標識
          <groupId>com.imooc.XXX</groupId>
          <artifactId>XXX-XXX</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <exclusions>
              <exclusion>
                  <groupId>com.imooc.A</groupId>
                  <artifactId>XXX-A</artifactId>
              </exclusion>
          </exclusions>
        </dependency>
      </dependencies>
    這樣就不會依賴於A了

另:想要每新建的項目JRE都是固定的版本號,那麼比較簡單的方法就是打開maven安裝路徑下的settings文件,在182行左右,可以看到有profiles,然後輸入一段代碼:
    <profile>
      <id>jdk-1.8</id>

      <activation>
          <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>

      <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
    </profile>
    這樣在新建項目的時候就會都變成1.8


依賴衝突:有A和B依賴了一個不同版本的相同構建,對於依賴A B 和 C來說,他究竟依賴的是A和B的哪一種構建?

用來搜索新的依賴下載
https://www.mvnrepository.com

    這裏有兩條原則:1、短路優先(它會優先解析這個路徑短的版本)
                    例子:A->B->C->X(jar)
                            A->D->X(jar)      √                                                                                                        
                        那麼它會優先解析下面路徑短的版本                                                                                                
                2、先聲明先優先(如果路徑長度相同,則誰先聲明,先解析誰)                                                                                  



聚合和繼承                                                                                                                                                        
    聚合是將多個項目整合在一起進行,比如install,避免了分開式的操作,那麼在pom.xml中寫入:                                                                                |
    <modules>                                                                                                                                                    
        <module>../hongxing-bg</module>                                                                                                                            
        <module>../hongxing-ng</module>                                                                                                                            
        <module>../hongxing-sj</module>                                                                                                                            
    </modules>                                                                                                                                                    
                                                                                                                                                               
    繼承                                                                                                                                                            
    要使用繼承需要有一個父類的項目,在這個項目中是不需要有main和test的,所以可以將其刪除掉,打開pom,在依賴項的外層加一個dependencyManagement,這樣就可以被繼承了。            
    其中dependency下的version可以放在properties下                                                                                                                    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <junit.version>3.8.1</junit.version>
        </properties>
    然後在dependency下的version中修改成<version>${junit.version}</version>
    最終是以下代碼:
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <junit.version>3.8.1</junit.version>
        </properties>
        
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>${junit.version}</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

    隨後在子類中dependency下的version和scope去掉,在上面加入parent的標籤,parent下是繼承的座標粘貼過來:
        <parent>
            <groupId>com.hongxing</groupId>
            <artifactId>hongxing-parent</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    最終子類的代碼就是:
        <parent>
            <groupId>com.hongxing</groupId>
            <artifactId>hongxing-parent</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
            <dependency>                                                                                                                                        
                <groupId>commons-io</groupId>                                                                                                                    
                <artifactId>commons-io</artifactId>                                                                                                                
                <version>2.4</version>                                                                                                                            
            </dependency>                                                                                                                                       
        </dependencies>                                                                                                                                            
 



使用maven構建web項目
在最開始創建的web項目中,index.jsp是錯誤的,因爲沒有Servlet API的緣故,現在在網站中(https://www.mvnrepository.com)搜索servlet。
啓動服務有兩種形式:1、jetty 2、Tomcat
                    1、在https://www.mvnrepository.com中搜索jetty maven plugin字樣進行搜索,然後選取版本號進行粘貼
                    好用的內容如下:
                     <groupId>org.mortbay.jetty</groupId> 
                     <artifactId>jetty-maven-plugin</artifactId> 
                     <version>8.1.16.v20140903</version>
                     在啓動服務的時候輸入:jetty:run,同時也可以在打包的時候啓動服務,那麼需要在build下添加plugins、plugin、executions、execution標籤。代碼爲:
                     <plugins>
                        <plugin>
                            <!-- jetty服務進行啓動 <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> 
                                <version>8.1.16.v20140903</version> -->
                            <groupId>org.apache.tomcat.maven</groupId>
                            <artifactId>tomcat7-maven-plugin</artifactId>
                            <version>2.2</version>
                            <executions>
                                <execution>
                                    <!-- 在打包成功後使用jetty:run來運行jetty服務 -->
                                    <phase>package</phase>
                                    <goals>
                                        <goal>run</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                    添加好之後就可以輸入clean package進行打包並啓動服務了。


                    2、在https://tomcat.apache.org中,左側有一個Maven Plugin,點擊進去選擇一個版本粘貼,內容如下:
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章