首頁  >  文章  >  Java  >  maven 概要與用法

maven 概要與用法

零下一度
零下一度原創
2017-06-25 10:53:081715瀏覽

01. maven 摘要

   首先我把 maven 的概念快速的梳理一下,讓我們快速地建立起一個比較精確的 maven 應用場景。

   maven 不是ant,也不是make,以前接觸的建置工具,需要寫一些詳細的步驟,如: compile project1/src/*.java 等類似的語句。

   maven 採用了"約定優於設定"的方法,有些開發常用的操作和步驟已經固化在 maven中,所以使用者不再需要寫那些語句。

   maven 內建了開發流程的支持,它不僅能夠編譯,同樣能夠打包、發布,也能夠一氣呵成做完這些所有的步驟。

   maven 不是ivy,依賴管理是maven 的功能之一,maven 在依賴關係中加入了scope 的概念,進一步細化了依賴關係的劃分。

   maven 將自己定位為專案管理工具。它負責管理專案開發過程中的如下幾乎所有的東西。

   a.版本:maven有自己的版本定義與規則;

   b.建置: maven支援許多種的應用程式類型,對於每一種支援的應用程式類型都定義好了一組建置規則和工具集;

   c.輸出物管理:maven可以管理專案建置的產物,並將其加入到使用者庫中。這個功能可以用於專案組和其他部門之間的交付行為; 

   d.依賴關係: maven對依賴關係的特性進行細緻的分析和劃分,避免開發過程中的依賴混亂和相互污染行為;

   e.文檔和構建結果:maven的site命令支援各種文檔資訊的發布,包括建置過程的各種輸出,javadoc,產品文件等;

   f.專案關係:一個大型的專案通常有幾個小專案或模組組成,用maven可以很方便地管理;

   h.移植性管理: maven可以針對不同的開發場景,輸出不同種類的輸出結果;

02. maven 生命週期

   

   maven把專案的建置分割為不同的生命週期(lifecycle),包括:驗證、編譯、測試、打包、部署。

   maven中所有的執行動作(goal)都需要指明自己在這個過程中的執行位置,然後maven執行的時候,就依照過程的發展依序調用這些goal進行各種處理。

   這個也是maven的基本排程機制。一般來說,位置稍後的過程都會依賴先前的過程。

   當然,maven同樣提供設定文件,可以依照使用者要求,跳過某些階段。

03. maven "約定優於設定"

#   

##   maven 中"約定優於配置" 並不是完全不可以修改的,他們只是一些配置的預設值而已。

   但是使用者除非必要,並不需要修改那些約定內容。

   maven預設的檔案存放結構如下:

   /專案目錄#pom.xml用於maven的設定檔

   /src 原始碼目錄

   /src/main 工程原始碼目錄

   /src/main/java 工程java原始碼目錄

#   / src/main/resource 工程的資源目錄

   /src/test 單元測試目錄

   /src/test/java

#   /target 輸出目錄,所有的輸出物都存放在這個目錄下

   /target/classes 編譯之後的class檔案

#   每個階段的任務都知道怎麼正確完成自己的工作。

   如 compile 任務就知道從 src/main/java 下編譯所有的 java 文件,並把它的輸出class檔案存放到 target/classes 中。

   採用"約定優於設定"的策略可以減少修改配置的工作量,也可以降低學習成本,更重要的是,為專案引入了統一的規範。

04. maven 版本規格

              <groupId>org.springframework</groupId>  <artifactId>spring-webmvc</artifactId>  <version>4.3.7.RELEASE</version>

   maven 使用4個要素來唯一定位某一個輸出物: groupId:artifactId:packaging:version 。如 org.springframework:spring:2.5 。

   groupId 團體,公司,小組,組織,項目,或其它團體。團體標識的約定是,它以創建這個項目的組織名稱的逆向域名開頭。

   artifactId 在groupId下的表示一個單獨項目的唯一識別碼。例如我們的 tomcat, commons 等。不要在 artifactId 中包含點號(.)。 

   version 一個專案的特定版本。發布項目有一個固定的版本標識來指向該項目的某一個特定的版本。

   雖然專案的打包格式也是 Maven 座標的重要組成部分,但它不是專案唯一識別碼的一部分。

   一個專案的 groupId:artifactId:version 使之成為一個獨一無二的專案;你不能同時有一個擁有相同的 groupId, artifactId,version 標識的專案。

   packaging 項目的類型,預設是 jar,描述了項目打包後的輸出。

   maven 在版本管理時可以使用幾個特殊的字串 SNAPSHOT ,LATEST ,RELEASE 。

   例如"1.0-SNAPSHOT"。 各部分的意義與處理邏輯如下說明:

   SNAPSHOT:用於開發流程,Maven 就會在安裝或發佈這個元件的時候將符號展開為一個日期和時間值,轉換為UTC時間。

   例如,"1.0-SNAPSHOT"會在2010年5月5日下午2點10分發佈時候變成 1.0-20100505-141000-1。

   LATEST:指某個特定構件的最新發布,這個發布可能是發布版,也可能是一個snapsho t版,具體看哪個時間最後。 

   RELEASE:指最後一個發布版。

05. maven 依賴管理

#   個人認為依賴管理是maven中最吸引人的功能特性,這個特性讓開發者只需要注意程式碼的直接依賴。

   例如我們用了spring,就加入spring 依賴說明就可以了,至於 spring 自己還依賴哪些外在的東西,maven 幫我們搞定。

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

   這裡的version 可以用區間表達式來表示,例如(2.0,) 表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多個條件之間用逗號分隔,如[1,3),[5,7]。

   maven 認為程式對外在的依賴會隨著程式的所處階段和應用場景而變化,所以 maven 中的依賴關係有作用域(scope)的限制。

   scope 包含如下的值:

   compile(編譯範圍)---> #compile 是默認的範圍,編譯範圍依賴在所有的classpath中可用,同時它們也會被打包。

   provided(已提供範圍) ---> provided 依賴只有在當 JDK 或一個容器已提供該依賴之後才使用。

   例如你開發了一個web應用,在編譯 classpath 中需要可用的 Servlet API 來編譯 servlet,又不想在打包好的 WAR 中包含這個 Servlet API。

   runtime(运行时范围 --> runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。

   比如你可能在编译的时候只需要 JDBC API JAR,而只有在运行的时候才需要 JDBC 驱动实现。

   test(测试范围)--> test 范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

   system(系统范围) --> system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR 文件的路径。

    <dependency> <groupId>org.wltea</groupId> <artifactId>analyzer</artifactId> <version>2012_u6</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/analyzer-2012_u6.jar</systemPath> </dependency>

   注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。

   type 一般在pom引用依赖时候出现,其他时候不用, optional 是否可选依赖。

   依赖也可以是可选的,比如我们代码中没有任何cache依赖,但是hibernate可能要配置cache,所以该cache的依赖就是可选的。

06. maven 多项目管理

   maven的多项目管理也是非常强大的。一般来说,maven要求同一个工程的所有子项目都放置到同一个目录下,每一个子目录代表一个项目,比如

   总项目/ pom.xml 总项目的 pom 配置文件

   子项目1/pom.xml 子项目1的 pom 文件

   子项目2/ pom.xml 子项目2的 pom 文件

   按照这种格式存放,就是继承方式,所有具体子项目的pom.xml都会继承总项目pom的内容,取值为子项目pom内容优先。

   要设置继承方式,首先要在总项目的pom中加入如下配置

<modules>   <module>simple-weather</module>   <module>simple-webapp</module> </modules>

   其次在每个子项目中加入

<parent>   <groupId>org.sonatype.mavenbook.ch06</groupId>   <artifactId>simple-parent</artifactId>   <version>1.0</version> </parent>

   当然,继承不是唯一的配置文件共用方式,maven还支持引用方式。引用pom的方式更简单,在依赖中加入一个type为pom的依赖即可。

  <dependency>      <groupId>org.sonatype.mavenbook</groupId>      <artifactId>persistence-deps</artifactId>      <version>1.0</version>      <type>pom</type>   </dependency>

07. maven 内置属性

  用户可以在maven中定义一些属性,然后在其他地方用${xxx}进行引用。比如:

 value1

   maven 提供了三个隐式的变量,用来访问系统环境变量、POM信息和 maven 的 settings:

   env 暴露操作系统的环境变量,比如 env.PATH

   project 暴露 POM 中的内容,用点号(.)的路径来引用POM元素的值,比如 ${project.artifactId}。另外,java的系统属性比如user.dir等,也暴露在这里。 

   settings 暴露 maven 的 settings 的信息,也可以用点号(.)来引用。

08. maven profile

   profile 是 maven 的一个重要特性,它可以让 maven 能够自动适应外部的环境变化。

   比如同一个项目,在linux下编译linux的版本,在win下编译win的版本等。

   一个项目可以设置多个 profile,也可以在同一时间设置多个 profile 被激活(active)的。

   自动激活的 profile 的条件可以是各种各样的设定条件,组合放置在 activation 节点中,也可以通过命令行直接指定。

   profile 包含的其他配置内容可以覆盖掉 pom 定义的相应值。

   如果认为 profile 设置比较复杂,可以将所有的 profiles 内容移动到专门的 profiles.xml 文件中,不过记得和 pom.xml 放在一起。

09. maven 配置文件

   maven的主执行程序为 mvn.bat,linux下为mvn.sh,这两个程序都很简单,它们的共同用途就是收集一些参数,然后用 java.exe来运行maven的Main函数。

   maven 同样需要有配置文件,名字叫做 settings.xml,它放在两个地方,一个是 maven 安装目录的conf目录下,对所有使用该 maven 的用户都起作用。

   我们称为主配置文件,另外一个放在 %USERPROFILE%/.m2/settings.xml 下,我们成为用户配置文件,只对当前用户有效,且可以覆盖主配置文件的参数内容。

   还有就是项目级别的配置信息了,它存放在每一个 maven 管理的项目目录下,叫 pom.xml,主要用于配置项目相关的一些内容。

   当然,如果有必要用户也可以在 pom 中写一些配置,覆盖住配置文件和用户配置文件的设置参数内容。

   一般来说,settings文件配置的是比如repository库路径之类的全局信息,具体可以参考官方网站的文章。

10. maven 本地安装和中央库发布

   在maven中一般都会用到安装库文件的功能,一则是我们常用的hibernate要使用jmx库,但是因为sun的license限制,所以无法将其直接包含在repository中。

   所以我们使用mvn命令把jar安装到我们本地的repository中

 mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file

   如果我们想把它安装到公司的repository中,需要使用命令

mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl= -DrepositoryId=release-repo

   对于我们的工程输出,如果需要放置到公司的repository中的话,可以通过配置 pom 来实现

<distributionManagement> 
   <repository> 
      <id>mycompany-repository</id> 
      <name>MyCompany Repository</name> 
      <url>scp://repository.mycompany.com/repository/maven2</url> 
   </repository> </distributionManagement>

11. maven 常用命令

1. 创建Maven的普通java项目: 
   mvn archetype:create -DgroupId=packageName -DartifactId=projectName 
2. 创建Maven的Web项目: 
   mvn archetype:create -DgroupId=packageName -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp 
3. 编译源代码: mvn compile 
4. 编译测试代码:mvn test-compile 
5. 运行测试:mvn test 
6. 产生site:mvn site 
7. 打包:mvn package 8. 在本地Repository中安装jar:mvn install 
9. 清除产生的项目:mvn clean 
10. 生成eclipse项目:mvn eclipse:eclipse 
11. 生成idea项目:mvn idea:idea 
12. 组合使用goal命令,如只打包不测试:mvn -Dtest package 13. 编译测试的内容:mvn test-compile 
14. 只打jar包: mvn jar:jar 
15. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile 
( -skipping 的灵活运用,当然也可以用于其他组合命令) 
16. 清除eclipse的一些系统设置:mvn eclipse:clean

 

以上是maven 概要與用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn