Maven 自問自答
Apache Maven,作爲一個項目管理和綜合的工具,說起來很尷尬,一直以來,我都是把他當成一個依賴管理的工具而已,方便的地方就是我不用到處找jar包。同時,我還把他和IDE工具緊密的依賴在一起,每次都是用IDE工具去生成maven,這樣看起來真的很糟糕,所以,寫這篇自問自答來補全一下知識。
maven有什麼用
maven作爲一個項目構建和管理的工具,提供了幫助管理、構建、文檔、報告、依賴、發佈、分發的方法,可以方便的編譯代碼、進行依賴管理、管理二進制庫等等,有利於項目過程的規範化、自動化、高效化、增強了可擴展性。
POM 是一個什麼東西
project object model ,項目對象模型。pom中包含了項目的信息和maven build項目所需要的配置信息,通常有項目信息、依賴、插件、goal、build等等。pom是可以被繼承的,因此有擴展性。
解讀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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.chen</groupId>
<artifactId>my_spring_boot</artifactId>
<packaging>war</packaging>
<name>my_spring_boot Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>0.5.0.BUILD-SNAPSHOT</version>
</parent>
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- Package as an executable JAR -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- Allow access to Spring milestones and snapshots -->
<!-- (you don't need this if you are using anything after 0.5.0.RELEASE) -->
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
modelVersion:是object model版本,除非maven開發者升級版本,否則不需要修改。
groupId:指的是項目構建團體或組織唯一標識符,通常是域名倒寫。
artifactId:指的是項目名。
package:指的是打包方式:jar、war、ear等等,默認jar。
version artifact:通常是0.0.1-SNAPSHOT,開發版。
name:maven文檔中,目的展示名。
url:項目地址。
dependencies:依賴。
parent:父類的pom。
snapshot :快照倉庫。
pluginRepositories:插件倉庫。
Build Lifecycle
一個項目build的過程。maven的Build Lifecycle分爲三種,分別爲default(處理項目的部署)、clean(處理項目的清理)、site(處理項目的文檔生成)。他們都包含不同的lifecycle。
maven 三條指令運行web項目
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=packageName -DartifactId=webappName
示例:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.chen.web -DartifactId=my_mavencd my_maven
mvn tomcat:run -Dmaven.tomcat.port=8080
maven常用指令
mvn compile:編譯源代碼
mvn test-compile:編譯測試代碼
mvn clean:清空
mvn test:運行測試
mvn package:打包項目
mvn install:安裝打包的jar到本地倉庫
mvn clean package:清楚target再打包
maven結構
my-app
|--pom.xml
|--src
|--main
|--java
|--com
|--mycompany
|--app
|--App.java
|--test
|--java
|--com
|--mycompany
|--app
|--AppTest.java
maven快照版是什麼
如果maven依賴都是release,那麼每次更新以來都是要更換版本才能下載,這樣就麻煩了,比如 你依賴的依賴是處於開發期中的,那麼每次他修改一次代碼(會很頻繁),就要升級一次版本,所以maven2推出了snapshot快照倉庫和release發佈倉庫。
dependency中的scope含義
maven打包的時候,是否進行打包。
-compile:默認範圍
-provided:說明jdk或容器已經提供這依賴
-runtime:運行和測試需要,編譯不需要
-test:測試需要
-system:和provided一樣
maven座標是什麼
座標就是maven構件的定位。比如說junit:junit:4.8.2表示的就是倉庫中的路徑/junit/junit/4.8.2/junit-4.8.2.pom和/junit/junit/4.8.2/junit-4.8.2.jar這個文件。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
version
<主版本>.<次版本>.<增量版本>-<限定符>
Classifier
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>JDK15</classifier>
</dependency>
定義version的版本
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-beans</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-context</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-core</artifactId>
<version>2.5</version>
</dependency>
以上代碼可改爲
<properties>
<spring.version>2.5</spring.version>
</properties>
<depencencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</depencencies>
多模塊中統一一些依賴
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
</dependencyManagement>
子模塊就可以簡化成
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
</dependency>