在上一篇POST中,簡要的介紹了一下maven的特點,優勢,安裝。並建立了一個簡單地Hello world工程。這一篇POST中,將主要會介紹一下Maven的一些約定。
pom.xml文件
Maven的項目文件是一個XML文件,叫做pom.xml,取Project Object Model的意思。對於項目的配置,都是修改POM.xml完成的。
一個簡單地pom配置文件如下:
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>me.reyoung</groupId>
<artifactId>helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>helloworld</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</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項目目錄結構爲:
my-app
|-- pom.xml
|-- src
| |-- main
| | `-- java
| | `-- com
| | `-- mycompany
| | `-- app
| | `-- App.java
| `-- test
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- AppTest.java
`-- target
|-- *.jar
`-- *
其中,根目錄裏包括src目錄和target目錄。
- src目錄爲源代碼目錄,包括該項目所有的代碼或者資源文件。
- src下的main目錄,包括所有的正式代碼。
- 代碼子目錄。 而在這個目錄下的java子目錄,表示該程序所有的java代碼。其他語言的代碼,均爲其他語言的目錄,例如scala目錄等。
- 資源子目錄。 包括resources目錄,這個目錄在編譯成jar的時候,會打包進入jar。當然還有其他的資源,例如web資源等。
- src下的test目錄,包括所有測試運行時的代碼。其子目錄結構和src/main中的一樣。
- 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庫中
同時,這些命令也可以組合使用。例如,我想要先刪除之前編譯的東西,然後再編譯,然後測試,然後打包,然後安裝到本地,就可以輸入命令
mvn clean compile test package install
maven會按照順序依次執行。。同時,maven命令先天的支持測試,所以對於自動化測試和持續集成,非常有幫助。可以用git的hook,監聽代碼版本庫的變化,當test不過的時候,不予提交等等。
這篇介紹了一些maven中的基本概念。下一篇中會實際的寫一個maven的工程,同時運用一下多模塊的工程結構。做個預告。。