Maven 开 发 规 范
Maven 開 發 規 范
轉自:http://blog.csdn.net/gaoqiao1988/article/details/52620376
目???錄
1.Maven簡介...?4
1.1什么是 Maven?...?4
1.2 Maven 能夠幫助我們干什么?...?4
2.Maven深入了解...?5
2.1 Maven 概念模型...?5
2.2 Pom全景圖...?5
2.3 Maven中pom.xml關鍵詞...?6
2.4 Maven 常見命令...?10
2.5 Maven的默認生命周期...?11
2.6 Maven 標準目錄結構...?13
2.7 Maven依賴查詢...?15
2.8 Maven中/.m2/settings.xm配置介紹...?16
3 使用Nexus搭建Maven私服...?17
3.1私服簡介...?17
3.2 使用Nexus搭建私服...?18
3.3 項目私服配置...?26
?
?
?
?
?
?
?
?
?
?
?
1.Maven簡介
1.1什么是 Maven?
Maven是Apache的一個頂級的項目:http://maven.apache.org/
Maven這個單詞來自于意第緒語(猶太語),意為知識的積累,最早在JakataTurbine項目中它被用來簡化項目的構建過程。當時有很多項目,它們的Ant build文件僅有細微的差別,而JAR文件都由CVS來維護。于是Maven創始者開始了Maven這個項目,該項目的清晰定義包括,一種很方便的發布 項目信息的方式,以及一種在多個項目中共享JAR的方式。
Maven是一個項目管理工具,它包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命周期(ProjectLifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(goal)的邏輯。當你使用Maven的時候,你用一個明確定義的項目對象模型來描述你的項目,然后 Maven 可以應用橫切的邏輯,這些邏輯來自一組共享的(或者自定義的)插件。
Maven 包含一個生命周期,當你運行 mvn install 的時候被調用。這條命令告訴 Maven 執行一系列的有序的步驟,直到到達你指定的生命周期。遍歷生命周期旅途中的一個影響就是,Maven 運行了許多默認的插件目標,這些目標完成了像編譯和創建一個 JAR 文件這樣的工作。
此外,Maven能夠很方便的幫你管理項目報告,生成站點,管理JAR文件,等等。
?
1.2 Maven能夠幫助我們干什么?
簡言之,Maven 可以幫助我們完成以下工作:
- 項目構建
- 文檔管理
- 生成測試報告
- 解決項目間依賴項
- 源代碼版本管理
- 項目Releases
- 項目的分發
?
?
?
2.Maven深入了解
2.1 Maven概念模型
2.2 Pom全景圖
2.3 Maven中pom.xml關鍵詞
- Project:
- 任何你想 build 的事物,Maven都會把它們當作是一個 Project。
- 這些 Project 被定義為 POM(Project Object Model)。
- 一個 Project 可以依賴其他的project,一個 project 也可以有多個子project組成。
- POM:
- POM(pom.xml) 是 Maven 的核心文件,它是指示 Maven 如何工作的元數據文件,類似 ant 的 build.xml 文件。
- pom.xml 文件應該位于每個 Project 的根目錄。
- GroupId:
- 公司名或組織名。
- ArtifactId:
- 構建出來的文件名,一般來說,這個也是project名。
- Packaging:
- 項目打包的類型,可以是將jar、war、rar、ear、pom。
- Version:
- 項目的版本,項目的唯一標識由 groupId+artifactId+packaging+versionz 組成。
- Dependency:
- 為了能夠 build 或運行,一個典型的java project會依賴其他的包,在Maven中,這些被依賴的包就被稱為 dependency。
- Plugin:
- Maven是有插件組織的,它的每一個功能都是由插件提供的,主要的插件是由 java 來寫的,但是他也支持 beanshell 和 ant 腳本編寫的插件。
- Repository:
- 倉庫用來存放artifact的,可以是本地倉庫,也可以是遠程倉庫,Maven是由一個默認的倉庫.
- 本地倉庫在setting.xml中的<localRepository>中設置
- Snapshot:
- 工程中可以(也應該)有這樣一個特殊的版本:這個版本可以告訴Maven,該工程正在處于開發階段,會經常更新(但還為發布)。當其他工程依賴此類型的artifact時,Maven會在倉庫中尋找該artifact的最新版本,并自動下載、使用該最新版本。
Tips:?groupId,artifactId和version這三個元素定義了一個項目的基本坐標,在Maven項目中,任何jar,pom或war都是以基于這些基本坐標進行區分的。
?
?
?
補充:1、建議在parent的pom中使用好pluginManagement和dependencyManagement,而子項目引用即可;
2、使用參數,方便管理版本和重要參數;
3、明顯不用的dependency要exclude掉(使用exclusion),避免過多垃圾;
4、合理設置子項目?
pluginManagement是表示插件聲明,即在項目中的pluginManagement下聲明了插件,maven不會加載該插件,pluginManagement聲明可以被繼承。
pluginManagement的一個使用案例是當有父子項目的時候,父項目中可以利用pluginManagement聲明子項目中需要用到的插件, 之后,當某個或者某幾個子項目需要加載該插件的時候,就可以在子項目中plugins節點只配置?groupId?和?artifactId就可以完成插 件的引用。
pluginManagement主要是為了統一管理插件,確保所有子項目使用的插件版本保持一致,類似的還有dependencies和dependencyManagement。
2.3.1 pom中依賴配置
?????? <dependency>
??????????????? <groupId></groupId>
??????????????? <artifactId></artifactId>
??????????????? <version></version>
??????????????? <classifier></classifier>
??????????????? <systemPath></systemPath>
??????????????? <scope></scope>---------------依賴范圍
??????????????? <type></type>-----------------依賴的類型
??????????????? <optional></optional>---------標記依賴是否可選
??????????????? <exclusions></exclusions>-----排除傳遞依賴
??????? </dependency>
?
pom.xml中簡寫:
??????? <dependency>
??????????????? <groupId>org.springframework</groupId>
??????????????? <artifactId>spring-context-support</artifactId>
??????????????? <version>3.2.10.RELEASE</version>
??????? </dependency>
?
pom 依賴調解原則:①第一原則,路徑近者優先原則
??????????????? ②第二原則,第一聲明者優先原則
2.3.2 pom中使用第三方倉庫
<distributionManagement>
??? <repository>
??? ??? <id>releases</id>
??????? <url>http://182.92.3.15:8081/nexus/content/repositories/releases</url>
??? </repository>
??? <snapshotRepository>
??? ??? <id>snapshots</id>
??? ??? <url>http://182.92.3.15:8081/nexus/content/repositories/snapshots</url>
??? </snapshotRepository>
</distributionManagement>
?
?
?
?
2.3.3?編譯Java代碼插件
??????? <plugin>
??????????? <artifactId>maven-compiler-plugin</artifactId>
??????????? <version>3.1</version>
??????????? <configuration>
??????????? ??? <source>1.6</source>
??????????? ??? <target>1.6</target>
??????????? ??? <encoding>UTF-8</encoding>
??? ??????? </configuration>
??????? </plugin>
?
?
?
?
2.3.4處理資源文件插件
??????? <plugin>
??????????? <artifactId>maven-resources-plugin</artifactId>
??????????? <version>2.6</version>
??????????? <configuration>
??????????????? <encoding>UTF-8</encoding>
??????????? </configuration>
??????? </plugin>
?
?
2.3.5?源碼打包插件
??????? <plugin>
??????????? <groupId>org.apache.maven.plugins</groupId>
??????????? <artifactId>maven-source-plugin</artifactId>
??????????? <version>2.2.1</version>
??????????? <executions>
??????????????? <execution>
??????????????????? <id>attach-sources</id>
??????????????????? <phase>verify</phase>
??????????????????? <goals>
??????????????????????? <goal>jar-no-fork</goal>
??????????????????? </goals>
??????????????? </execution>
??????????? </executions>
??????? </plugin>
?
?
2.3.6?生成javadoc文檔包的插件
??????? <plugin>
??????????? <groupId>org.apache.maven.plugins</groupId>
??????? ??? <artifactId>maven-javadoc-plugin</artifactId>
??? ??????? <version>2.8</version>
??????????? <configuration>
??????????????? <outputDirectory>target\javadoc</outputDirectory>
??????? ??????? <reportOutputDirectory>target\javadoc</reportOutputDirectory>
??????????????? <encoding>UTF-8</encoding>
??????????? </configuration>
??????? </plugin>
?
?
?
2.3.7?測試插件
??? <plugin>
??????? <groupId>org.apache.maven.plugins</groupId>
??????? <artifactId>maven-surefire-plugin</artifactId>
??????? <version>2.7.2</version>
??????? <configuration>
??????????? <skip>true</skip>
??????? </configuration>
??? </plugin>
2.3.8 Tomcat插件
??? <plugin>
??????? <groupId>org.apache.tomcat.maven</groupId>
??????????? <artifactId>tomcat7-maven-plugin</artifactId>
??????????? <version>2.1</version>
??? </plugin>
?
2.3.9 一些比較常用的插件(Maven倉庫搜索引擎:http://search.maven.org/ )
①maven-archetype-plugin
使用交互式的方式提示用戶輸入必要的信息以創建項目, 如由一個產品需要交付給很多客戶進行二次開發,你就可以為他們提供一個Archtype,幫助他們快速上手。
http://maven.apache.org/archetype/maven-archetype-plugin/
?
②maven-assembly-plugin
制作項目分發包,該分發包可能包含了項目的可執行文件、源代碼、readme、平臺腳本等等。
http://maven.apache.org/plugins/maven-assembly-plugin/
?
③maven-dependency-plugin
幫助分析項目依賴
http://maven.apache.org/plugins/maven-dependency-plugin/
?
④maven-enforcer-plugin
創建一系列規則強制遵守,設定Java版本、設定Maven版本、禁止某些依賴、禁止SNAPSHOT依賴。只要在一個父POM配置規則,然后讓大家繼承,當規則遭到破壞的時候,Maven就會報錯。除了標準的規則之外,還可以擴展該插件,編寫自己的規則。有助于保持項目構建穩定
http://maven.apache.org/plugins/maven-enforcer-plugin/
?
⑤maven-help-plugin
一個小巧的輔助工具,?help:system可以打印所有可用的環境變量和Java系統屬性。help:effective-pom和help:effective-settings,它們分別打印項目的有效POM和有效settings,?maven-help-plugin的describe目標可以幫助你描述任何一個Maven插件的信息.
http://maven.apache.org/plugins/maven-help-plugin/
?
⑥versions-maven-plugin
命令?mvn versions:set -DnewVersion=1.1-SNAPSHOT?就能把所有模塊的版本更新到1.1-SNAPSHOT。display-dependency-updates能知道項目依賴有哪些可用的更新;類似的display-plugin-updates能知道可用的插件更新;然后use- latest-versions能自動將所有依賴升級到最新版本。最后,可以使用?mvn versions:commit?提交,不滿意的話也可以使用?mvn versions:revert?進行撤銷。
http://mojo.codehaus.org/versions-maven-plugin/
2.4 Maven常見命令
?
| mvn archetype:create | 創建Maven項目 |
| mvn compile | 編譯源代碼 |
| mvn test-compile | 編譯測試源代碼 |
| mvn test | 運行應用程序中的單元測試 |
| mvn install | 在本地Respository中安裝jar |
| mvn eclipse:eclipse | 生成eclipse項目文件 |
| mvn idea:idea | 生成idea項目 |
| mvn jetty:run | 啟動jetty服務 |
| mvn tomcat:run | 啟動tomcat服務 |
| mvn clean | 清除項目目錄中的生成結果 |
| mvn site | 生成項目相關信息的網站 |
| mvn?package | 根據項目生成的jar |
| mvn deploy | 根據項目發布到私服 |
| mvn clean package -Dmaven.test.skip=true | 清除以前的包后重新打包,跳過測試類 |
| mvn -X compile dependency: ??? tree?-Dverbose >a.log | 檢查Jar包版本沖突, a.log文件里查找 是否有"omitted for conflict with",如果有,則表示jar包有版本沖突 |
?
?
?
?
?
2.5 Maven的默認生命周期
??
| Default Lifecycle | 生命周期階段 | 描述 |
| 第一套生命周期: Clean Lifecycle 在進行真正的構建之前進行一些清理工作。 | ||
| pre-clean | 執行項目清理前所需要的工作。 | |
| clean | 清理上一次build項目生成的文件。 | |
| post-clean | 執行完成項目清理所需的工作。 | |
| 第二套生命周期: Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。 | ||
| validate | 驗證 | 確保當前配置和 POM 的內容是有效的。這包含對 pom.xml 文件樹的驗證。 |
| initialize | 初始化 | 在執行構建生命周期的主任務之前可以進行初始化。 |
| generate-sources | 生成源碼 | 代碼生成器可以開始生成在以后階段中處理或編譯的源代碼。 |
| process-sources | 處理源碼 | 提供解析、修改和轉換源碼。常規源碼和生成的源碼都可以在這里處理。 |
| generate-resources | 生成資源 | 生成非源碼資源。通常包括元數據文件和配置文件。 |
| process-resources | 處理資源 | 處理非源碼資源。修改、轉換和重定位資源都能在這階段發生。 |
| compile | 編譯 | 編譯源碼。編譯過的類被放到目標目錄樹中。 |
| process-classes | 處理類 | 處理類文件轉換和增強步驟。字節碼交織器和常用工具常在這一階段操作。 |
| generate-test-sources | 生成測試源碼 | 為編譯內容生成測試源代碼。 |
| process-test-sources | 處理測試源碼 | 在編譯前對測試源碼執行任何必要的處理。在這一階段,可以修改、轉換或復制源代碼。 |
| generate-test-resources | 生成測試資源 | 允許生成與測試相關的(非源碼)資源。 |
| process-test-resources | 處理測試資源 | 可以處理、轉換和重新定位與測試相關的資源。 |
| test-compile | 測試編譯 | 編譯單元測試的源碼。 |
| process-test-classes | 對測試編譯生成的文件做后期處理(需Maven2.0.5及以上) | |
| test | 測試 | 運行編譯過的單元測試并累計結果。 |
| prepare-package | 執行打包前的所有操作(需Maven2.1及以上) | |
| package | 打包 | 將可執行的二進制文件打包到一個分布式歸檔文件中,如 JAR 或 WAR。 |
| pre-integration-test | 前集成測試 | 準備集成測試。這種情況下的集成測試是指在一個受到一定控制的模擬的真 |
| integration-test | 集成測試 | 執行真正的集成測試。 |
| post-integration-test | 后集成測試 | 解除集成測試準備。這一步涉及測試環境重置或重新初始化。 |
| verify | 檢驗 | 檢驗可部署歸檔的有效性和完整性。過了這個階段,將安裝該歸檔。 |
| install | 安裝 | 將該歸檔添加到本地 Maven 目錄。這一步讓其他可能依賴該歸檔的模塊可以使用它。 |
| deploy | 部署 | 將該歸檔添加到遠程 Maven 目錄。這一步讓這個工件能為更多的人所用。 |
| 第三套生命周期: Site Lifecycle 生成項目報告,站點,發布站點。 | ||
| pre-site | 執行一些生成項目站點文檔前的準備工作。 | |
| site | 生成項目站點的文檔。 | |
| post-site | 執行需完成站點生成的工作,如站點部署的準備工作。 | |
| site-deploy | 向制定的web服務器部署站點生成文件。 | |
?
Tips:?①Maven有三套相互獨立的生命周期
??????? ?②運行任何一個階段的時候,它前面的所有階段都會被運行
?
?
2.6 Maven標準目錄結構
好的目錄結構可以 使開發人員更容易理解項目,為以后的維護工作也打下良好的基礎。Maven2根據業界公認的最佳目錄結構,為開發者提供了缺省的標準目錄模板。Maven2的標準目錄結構如下:
?
| src/main/java | 源碼目錄 |
| src/main/resources | 主資源目錄 |
| src/main/filters | 資源過濾文件目錄 |
| src/main/assembly | Assembly descriptors |
| src/main/config | 配置文件目錄根 |
| src/main/scripts | Application/Library scripts |
| src/main/webapp | Web資源目錄(jsp,js,css) |
| src/test/java | 測試代碼目錄 |
| src/test/resources | 測試所需資源目錄 |
| src/test/filters | 測試資源過濾文件目錄 |
| src/site | 與site相關的資源目錄 |
| LICENSE.txt | Project's license |
| NOTICE.txt | Notices and attributions required by libraries that the project depends on |
| README.txt | Project's readme |
使用目錄模板,可以使 pom.xml 更簡潔。因為 Maven2 已經根據缺省目錄,預定義了相關的動作,而無需人工的干預。以 resources 目錄為例:
- src/main/resources,負責管理項目主體的資源。在使用Maven2執行compile之后,這個目錄中的所有文件及子目錄,會復制到target/classes目錄中,為以后的打包提供了方便。
- src/test/resources,負責管理項目測試的資源。在使用Maven2執行test-compile之后,這個目錄中的所有文件及子目錄,會復制到target/test-classes目錄中,為后續的測試做好了準備。
這些動作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>來完成的。如今,完全不需要在pom.xml中指定就能夠自動完成。在src和 test都使用resources,方便構建和測試,這種方式本就已是前人的經驗。通過使用Maven2,使這個經驗在開發團隊中得到普及。
創建標準目錄模板,可以通過如下命令:
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons
groupId和artifactId的含義與Maven1中的含義一樣,參數artifactId的值會作為項目根目錄的名字。除了建立相應的目錄之外,Maven2還會創建缺省的pom.xml。
Maven2也考慮到:不同類型的項目需要擁有不同的目錄結構。如創建web項目,可以使用命令:
mvn archetype:create -DgroupId=com.mycompany.app
-DartifactId=my-webapp
-DarchetypeArtifactId=maven-archetype-webapp
?
Tips:新版本中archetype:create命令已經過期,需要使用archetype:generate來進行替換
2.7 Maven依賴查詢
查詢地址:http://mvnrepository.com
可以通過該網站查詢所需要的依賴包格式
?
?
2.8 Maven中/.m2/settings.xm配置介紹
- localRepository:自定義本地庫路徑,默認在/.m2中
- interactiveMode:
- offline:是否每次編譯都去查找遠程中心庫
- pluginGroups:插件組,例如:org.mortbay.jetty
- proxies:通過代理訪問外部庫
- servers:集成認證服務
- mirrors:鏡像庫,可以指定內部中心庫
- profiles:個性配置,需要在Activation標簽中激活
- activeProfiles:表示激活的profile
?
?
?
?
?
?
?
?
?
?
?
?
3?使用Nexus搭建Maven私服
3.1私服簡介
私服是架設在局域網的一種特殊的遠程倉庫,目的是代理遠程倉庫及部署第三方構件。有了私服之后,當 Maven 需要下載構件時,直接請求私服,私服上存在則下載到本地倉庫;否則,私服請求外部的遠程倉庫,將構件下載到私服,再提供給本地倉庫下載。
我們可以使用專門的 Maven 倉庫管理軟件來搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。這里我們使用 Sonatype Nexus。
?
?
?
?
?
?
?
3.2 使用Nexus搭建私服
3.2.1下載Nexus
Nexus 專業版是需要付費的,這里我們下載開源版 Nexus OSS。Nexus 提供兩種安裝包,一種是包含 Jetty 容器的 bundle 包,另一種是不包含容器的 war 包。下載地址:http://www.sonatype.org/nexus/go
?
3.2.2 安裝Nexus
解壓安裝包nexus-3.0.1-01-win64.zip
修改數據存儲路徑,文件目錄:bin/nexus.vmoptions
?
進入etc/org.sonatype.nexus.cfg進行修改IP、端口, 訪問根目錄
修改完相關配置文件后,打開命令提示符:cmd,進入/nexus-3.0.1-01/bin目錄,命令:
執行 nexus.exe /run
?
打開瀏覽器,訪問:http://localhost:8081/nexuz-zip/
點擊右上角 Sign in,使用默認用戶名:admin ,密碼:admin123 登錄,
創建用戶
3.2.3 Nexus預置的倉庫
創建maven倉庫
pepositories說明:
maven-central:maven中央庫,默認從https://repo1.maven.org/maven2/拉取jar
maven-releases:私庫發行版jar
maven-snapshots:私庫快照(調試版本)jar
maven-public:倉庫分組,把上面三個倉庫組合在一起對外提供服務,在本地maven基礎配置settings.xml中使用。
點擊左側 Repositories 鏈接,查看 Nexus 內置的倉庫:
Nexus 的倉庫分類:
· hosted 宿主倉庫:主要用于部署無法從公共倉庫獲取的構件(如?Oracle?的 JDBC 驅動)以及自己或第三方的項目構件;
· proxy?代理倉庫:代理公共的遠程倉庫;
· virtual 虛擬倉庫:用于適配 Maven 1;
·group 倉庫組:Nexus 通過倉庫組的概念統一管理多個倉庫,這樣我們在項目中直接請求倉庫組即可請求到倉庫組管理的多個倉庫。
?
3.2.4 添加宿主倉庫- hosted repository
倉庫創建完畢
Tips:?配置hosted repository時,一般會配置3個hosted repository,分別是3rd party、Snapshots、Releases,分別用來保存第三方jar,項目組內部的快照、項目組內部的發布版
只是Deployment Policy這個選項,一般Snapshots會配置成允許,而Releases和3rd party會設置為禁止
?
配置proxy?repository?
代理中央Maven倉庫,當PC訪問中央庫的時候,先通過Proxy下載到Nexus倉庫,然后再從Nexus倉庫下載到PC本地。這樣的優勢只要其中一個人從中央庫下來了,以后大家都是從Nexus私服上進行下來,私服一般部署在內網,這樣大大節約的寬帶。
Remote Storage: 代理的地址,Maven地址為:https://repo1.maven.org/maven2/
開源中國倉庫地址:http://maven.oschina.net/content/groups/public/
Tips:?如果出現某些Maven插件找不到依賴的庫的問題,請修改代理地址,Maven3啟動了新的中央倉庫:?http://repo.maven.apache.org/maven2/
?
原先Nexus安裝好時已經自動創建了一個代理倉庫,可以直接通過搜索欄搜索到自己想找的項目
配置group?repository?
group其實是一個虛擬的倉庫,通過對實體倉庫(proxy、hosted)進行聚合,對外暴露一個統一的地址?,需要將選中的倉庫納入組內才可進行管理
此時已經可以看到納入的倉庫中的內容
需要在maven文件夾下.m2/settings.xml中新增配置,可以將內部倉庫設置成鏡像倉庫
?
3.2.5 配置Maven使用私服
私服搭建成功,我們就可以配置 Maven 使用私服,以后下載構件、部署構件,都通過私服來管理。
在 settings.xml 文件中,為所有倉庫配置一個鏡像倉庫,鏡像倉庫的地址即私服的地址:
項目中需要配備地址:
maven的setting文件中需要配備授權倉庫的帳戶與訪問地址:
Tips:id需要配置相同
Tips:如果為Snapshots 時,需要在發布的項目版本后追加,如果為Release,則不需要追加,即可發布項目-命令:deploy -e
項目發布完成后可以在私服管理頁面查看
總結
以上是生活随笔為你收集整理的Maven 开 发 规 范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谢霆锋和房祖名diy的松露蛋糕做法?
- 下一篇: 子宫腺肌症会肚子疼吗