maven使用.02.一些概念

在上一篇POST中,簡要的介紹了一下maven的特點,優勢,安裝。並建立了一個簡單地Hello world工程。這一篇POST中,將主要會介紹一下Maven的一些約定。

pom.xml文件

Maven的項目文件是一個XML文件,叫做pom.xml,取Project Object Model的意思。對於項目的配置,都是修改POM.xml完成的。

一個簡單地pom配置文件如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>me.reyoung</groupId>
  5. <artifactId>helloworld</artifactId>
  6. <version>1.0-SNAPSHOT</version>
  7. <packaging>jar</packaging>
  8. <name>helloworld</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>3.8.1</version>
  18. <scope>test</scope>
  19. </dependency>
  20. </dependencies>
  21. </project>

可以看到,pom.xml是個標準的XML文件。其中前三行說明這是一個maven格式的XML文件。在第5行到第8行說明了當前項目的一系列信息。而這些信息是Maven的座標信息。

Maven座標信息

Maven座標信息指的是每一個maven工程所獨有的一個ID,而且,對於同一工程,不同的版本對應的座標不同。常見的座標包括有groupId:artifactId:version。其中:

  • groupId: 基本上這個屬性描述的是誰或者是哪個組織寫的這個項目
  • artifactId: 構建的ID,表示這個項目在那個組織中的名字
  • version: 項目的版本。這裏以SNAPSHOT結尾,表示該項目還是一個正在開發中的快照版本。
  • packaging: 該項目的打包方式,例如
    • 對於桌面應用和程序庫,打包成jar
    • 對於網絡應用打包成war
    • 對於maven的擴展或者子項目等等在maven系統中用的項目,打包成pom

使用這些座標,就可以定義出每一個Maven項目構建出來的結果了。比如,想找到圖數據庫Neo4J的座標。在maven的中心庫搜索出的座標爲 org.neo4j:neo4j:2.0.0-M03

Dependencies 信息

在pom.xml文件的Dependencies中,描述了這個項目依賴的第三方庫。而對於每個第三方庫,

  • 如果這個第三方庫,可以在maven的中心庫搜索到,那麼直接在Dependencies中,添加這個Dependency的maven座標就可以了。

  • 如果這個第三方庫,不再maven的中心庫中,那麼可以有幾種方法實現。這個在今後的博客中再討論。

maven的項目結構

介紹完畢maven的項目配置文件pom.xml,下面說一下maven的項目結構。

大家可能很奇怪,對於maven的工程文件pom.xml做了很多描述這個項目的工作,但是並沒有指定任何項目包含的文件。這就說到了maven的一個準則了。就是*約定大於編碼*。也就是,在maven中,很多東西都是約定俗成的,如果你不想遵守這個約定而使用maven,就會變得複雜。

maven的目錄結構

一個常見的maven項目目錄結構爲:

  1. my-app
  2. |-- pom.xml
  3. |-- src
  4. | |-- main
  5. | | `-- java
  6. | | `-- com
  7. | | `-- mycompany
  8. | | `-- app
  9. | | `-- App.java
  10. | `-- test
  11. | `-- java
  12. | `-- com
  13. | `-- mycompany
  14. | `-- app
  15. | `-- AppTest.java
  16. `-- target
  17. |-- *.jar
  18. `-- *

其中,根目錄裏包括src目錄和target目錄。

  • src目錄爲源代碼目錄,包括該項目所有的代碼或者資源文件。
    • src下的main目錄,包括所有的正式代碼。
      • 代碼子目錄。 而在這個目錄下的java子目錄,表示該程序所有的java代碼。其他語言的代碼,均爲其他語言的目錄,例如scala目錄等。
      • 資源子目錄。 包括resources目錄,這個目錄在編譯成jar的時候,會打包進入jar。當然還有其他的資源,例如web資源等。
    • src下的test目錄,包括所有測試運行時的代碼。其子目錄結構和src/main中的一樣。
  • target目錄爲編譯的結果目錄。包括編譯後的class文件,jar文件,也包括生成的測試報告。

這樣,常見的maven項目目錄格式,就是這樣了。可見,maven系統中的所包括的代碼,便是src目錄下的所有源文件。

Maven的命令或者叫做生命週期(Life Cycle)

Maven包括一組命令。例如mvn compile就是編譯,mvn test就是運行測試等。在maven這組命令中,基本上包括了軟件開發從依賴解決到部署的全部內容。maven官方稱這些爲Build Life Cycle。而build life cycle包括:

  • validate - 驗證項目是否正確,所有的依賴能否達到
  • compile - 編譯源代碼
  • test - 測試代碼
  • package - 將編譯好的源代碼打包
  • verify - 驗證這個包是不是正確
  • install - 將這個構建安裝到本地的maven庫中
  • deploy - 將這個構建上傳到遠端的maven庫中

同時,這些命令也可以組合使用。例如,我想要先刪除之前編譯的東西,然後再編譯,然後測試,然後打包,然後安裝到本地,就可以輸入命令

  1. mvn clean compile test package install

maven會按照順序依次執行。。同時,maven命令先天的支持測試,所以對於自動化測試和持續集成,非常有幫助。可以用git的hook,監聽代碼版本庫的變化,當test不過的時候,不予提交等等。


這篇介紹了一些maven中的基本概念。下一篇中會實際的寫一個maven的工程,同時運用一下多模塊的工程結構。做個預告。。

引用/參考

--------------------------------------
歡迎大家訪問我的野生博客
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章