首先我把 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可以針對不同的開發場景,輸出不同種類的輸出結果;
maven把專案的建置分割為不同的生命週期(lifecycle),包括:驗證、編譯、測試、打包、部署。
maven中所有的執行動作(goal)都需要指明自己在這個過程中的執行位置,然後maven執行的時候,就依照過程的發展依序調用這些goal進行各種處理。
這個也是maven的基本排程機制。一般來說,位置稍後的過程都會依賴先前的過程。
當然,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 中。
採用"約定優於設定"的策略可以減少修改配置的工作量,也可以降低學習成本,更重要的是,為專案引入了統一的規範。
<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:指最後一個發布版。
# 個人認為依賴管理是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的依赖就是可选的。
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>
用户可以在maven中定义一些属性,然后在其他地方用${xxx}进行引用。比如:
value1
maven 提供了三个隐式的变量,用来访问系统环境变量、POM信息和 maven 的 settings:
env 暴露操作系统的环境变量,比如 env.PATH
project 暴露 POM 中的内容,用点号(.)的路径来引用POM元素的值,比如 ${project.artifactId}。另外,java的系统属性比如user.dir等,也暴露在这里。
settings 暴露 maven 的 settings 的信息,也可以用点号(.)来引用。
profile 是 maven 的一个重要特性,它可以让 maven 能够自动适应外部的环境变化。
比如同一个项目,在linux下编译linux的版本,在win下编译win的版本等。
一个项目可以设置多个 profile,也可以在同一时间设置多个 profile 被激活(active)的。
自动激活的 profile 的条件可以是各种各样的设定条件,组合放置在 activation 节点中,也可以通过命令行直接指定。
profile 包含的其他配置内容可以覆盖掉 pom 定义的相应值。
如果认为 profile 设置比较复杂,可以将所有的 profiles 内容移动到专门的 profiles.xml 文件中,不过记得和 pom.xml 放在一起。
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库路径之类的全局信息,具体可以参考官方网站的文章。
在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>
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中文網其他相關文章!