示例:java
<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"> <!-- 聲明項目描述符遵循哪個POM模型版本。 --> <modelVersion>4.0.0</modelVersion> <!-- 項目的全球惟一標識符,一般使用全限定的包名區分該項目和其餘項目。--> <groupId>com.hyou</groupId> <!-- 構件的標識符,它和group ID一塊兒惟一標識一個構件。 換句話說,你不能有兩個不一樣的項目擁有一樣的artifact ID和groupID。 在某個 特定的group ID下,artifact ID也必須是惟一的。 --> <artifactId>ctms-v2-util</artifactId> <!-- 項目當前版本,格式爲:主版本.次版本.增量版本-限定版本號 --> <version>2.0.0</version> <!-- 項目產生的構件類型,例如jar、war、ear、pom等等 --> <packaging>jar</packaging> <!-- 項目的名稱 --> <name>ctms-v2-util</name> <!-- 項目主頁的URL --> <url>http://maven.apache.org</url> <!-- 全局變量屬性定義。定義一些變量,在pom文件的其餘位置能夠使用 --> <properties> <!-- 這裏面子節點名稱能夠自定,即爲變量名。 節點的值即變變量值。 使用的時候相似EL表達式的寫法: ${spring.version}, ${yourVarName} --> <spring.version>4.2.0.RELEASE</spring.version> <yourVarName>yourValue</yourVarName> </properties> <!-- 遠程倉庫發佈配置 --> <distributionManagement> <repository> <id>releases</id> <name>192.168.0.6 nexus repository</name> <url>http://192.168.0.6:9999/nexus/content/repositories/releases</url> </repository> </distributionManagement> <!-- 遠程倉庫代理配置 --> <repositories> <repository> <id>nexus-myland</id> <name>192.168.0.6 nexus repository</name> <url>http://192.168.0.6:9999/nexus/content/groups/public/</url> </repository> </repositories> <!-- 依賴配置,項目使用的各類類庫都經過該依賴配置加載 *** --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> </dependencies> <!-- 構建項目使用 --> <build> <!-- 通常配置一些插件,用於實現編譯、打包、測試等等應用場景 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <!-- 不一樣插件有不一樣的配置參數 --> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </build> </project>
2.1. 關於版本號的管理git
常見的GNU風格的版本號命名格式:github
主版本號 . 子版本號 [. 修正版本號 [. 編譯版本號 ]]web
示例: 4.2.5, 4.2.8.1spring
GNU風格的版本號管理策略:apache
- 項目第一版本時,版本號能夠爲 0.1 或 0.1.0, 也能夠爲 1.0 或 1.0.0
- 當項目在進行了局部修改或 bug 修正時,主版本號和子版本號都不變,修正版本號加 1
- 當項目在原有的基礎上增長了部分功能時,主版本號不變,子版本號加 1,修正版本號復位爲 0,於是能夠被忽略掉.
- 當項目在進行了重大修改或局部修正累積較多,而致使項目總體發生全局變化時,主版本號加 1
- 編譯版本號通常是編譯器在編譯過程當中自動生成的,咱們只定義其格式,並不進行人爲控制.
maven中的快照版本與正式版本api
- release : 發佈庫
- snapshot : 快照庫
2.2. 依賴配置中的scope節點屬性併發
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency>
- compile :默認的scope,表示 dependency 均可以在生命週期中使用。並且,這些dependencies 會傳遞到依賴的項目中。適用於全部階段,==會隨着項目一塊兒發佈==。
- provided :跟compile類似,可是代表了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能做用在編譯和測試時,同時==沒有傳遞性==。
- runtime :表示dependency不做用在編譯時,但會做用在運行和測試時,如JDBC驅動,適用運行和測試階段。
- test :表示dependency做用在測試時,不做用在運行時。 只在測試時使用,用於編譯和運行測試代碼。==不會隨項目發佈==。
- system : 跟provided 類似,可是在系統中要之外部JAR包的形式提供,maven不會在repository查找它。
3.1. compileapp
mvn compile
編譯源代碼,編譯後在target目錄下生成相應的class等編譯結果文件。eclipse
3.2. test
mnv test
執行測試,基於JUnit。它會運行test代碼目錄下的全部可運行的JUnit測試代碼。
3.3. package
mvn package
打包指令,將project打包成jar文件或war文件等。根據pom.xml中的packaging屬性配置打包成相應的文件。
生成的包文件命名格式以下:
[artifactId]-[version].jar
例如pom.xml中對project配置: <groupId>com.hyou</groupId> <artifactId>ctms-framework</artifactId> <version>2.0.0</version> <packaging>jar</packaging> 則打包生成的文件名以下: ctms-framework-2.0.0.jar
[artifactId].war 例如: xbv2.war
3.4. source:jar
mvn source:jar
源代碼打包指令,將java源文件等源代碼打成jar文件。
生成的包文件命名格式以下:
[artifactId]-[version]-source.jar
例如pom.xml中對project配置: <groupId>com.hyou</groupId> <artifactId>ctms-framework</artifactId> <version>2.0.0</version> <packaging>jar</packaging> ctms-framework-2.0.0-sources.jar
3.5. install
mvn install
將當前工程的代碼打包併發布到本地倉庫。在本地倉庫生成相應的jar文件等。
在本地倉庫中生成的jar文件命名格式與package打成的jar包命名方式相同。
4.1. 編譯相關的插件
與 mvn compile, mvn package 等編譯相關的指令有關。
配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin>
4.2. 單元測試相關的插件
與 mvn test 單元測試指令有關。不顯式配置則會按照默認配置處理。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.4</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin>
4.3. 單元測試覆蓋率統計相關的插件
與JUnit相結合的輔助工具,用於檢查JUnit測試用例對所測試源代碼的覆蓋率。能夠生成單元測試報告和相關的代碼覆蓋率統計。
<!-- 單元測試覆蓋率 --> <!-- cobertura:cobertura --> <!-- cobertura:clean --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.7</version> </plugin>
參考指令:
// 代碼覆蓋率統計執行 mvn cobertura:cobertura // 清空cobertura插件運行結果 mvn cobertura:clean
4.4. 源代碼打包相關的插件
將工程源代碼打包成jar文件
<!-- 源代碼打Jar包 --> <!-- source:jar --> <!-- package --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <excludes> <exclude>log4j.properties</exclude> <exclude>spring.properties</exclude> <exclude>applicationContext.xml</exclude> <exclude>conf/**</exclude> </excludes> </configuration> </plugin>
4.5. jetty web容器運行插件
web工程下,開發時用於啓動web容器。 這個6.1.26版本,只支持servlet2.X版本。
<!-- 啓動命令: jetty:run --> <!-- reload參數: [manual|automatic] --> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.26</version> <configuration> <contextPath>/xbv2</contextPath> <webDefaultXml>${project.basedir}/src/main/webapp/WEB-INF/webdefault.xml</webDefaultXml> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8080</port> </connector> </connectors> <reload>manual</reload> <scanIntervalSeconds>60</scanIntervalSeconds> </configuration> </plugin>
這個9.3.11.v20160721版本較高,可支持高版本servlet。不過與現有的web工程裏一些路徑的寫法有點不大兼容。
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.3.11.v20160721</version> <configuration> <scanIntervalSecond>20</scanIntervalSecond> <webApp> <contextPath>/xbv2</contextPath> </webApp> <classesDirectory>${project.basedir}/target/classes</classesDirectory> <httpConnector> <port>8080</port> </httpConnector> </configuration> </plugin>
- Maven Repository : http://mvnrepository.com/
- Apache中央倉庫: https://repo.maven.apache.org/maven2
- Maven官網 : http://maven.apache.org/
- github