Maven基于项目对象模型(POM),集项目构建,编译,测试,打包,安装一站式服务。是目前主流的项目开发的管理利器,今天来详细学习下。
一、Maven下载与环境搭建
Maven下载:http://maven.apache.org/download
下载压缩包,解压缩到D盘要目录即可
配置环境变量:
M2_HOME:D:\apache-maven-3.1.1\
Path添加:;%M2_HOME%\bin;
检测maven是否安装成功,打开cmd:mvn -v
如果能看到maven版本信息及jdk信息,就表示安装成功了。
二、Maven约定的目录骨架结构
src
-main
-java
-package
-test
-java
-package
-resources
三、常用的构建命令
mvn -v 查看版本信息
compile 编译 编译成功后,会生成target目录
test 测试 测试成功后,也会在target目录生成测试报告
package 打包 打包成功后,也会在target目录生成jar包
clean 清理target
install 安装jar包到本地仓库
以上构建命令需要运行在jdk上,jre上会报找不到tools.jar
四、自动创建目录骨架
在没有集成到eclipse中时,可以使用命令创建项目目录:
1.archetype:generate 按照提示一步一步创建即可
2.archetype:generate -DgroupId=组织名(一般为公司网址反写+项目名)
-DartifactId=项目名-模块名
-Dversion=版本号(SNAPSHOT为快照版,release为发布版本)
-Dpackage=代码所在的包名
五、坐标和仓库
坐标:每一个maven项目都由坐标来唯一定位,它有三个元素:
groupId
artifaceId
version
通过这三个元素就能准确找到一个maven项目
仓库:由maven管理的项目的所有jar包都在仓库中
仓库分为:
本地仓库
远程仓库(也叫中央仓库)
镜像仓库
我们使用的jar包会首先到本地仓库中去找,找不到会到远程仓库中下载到本地仓库。
1.本地仓库
一般我们安装完maven后,会在C盘的用户路径下:C:\Users\Yuwl\.m2有这个m2的文件夹,它就是我们的本地仓库,它下面有一个存放所有jar包的文件夹repository,还有一个settings.xml配置文件,它可以配置我们本地仓库的路径:
<localRepository>D:/.m2/repository</localRepository>
如,我的存放在D盘,因为C盘重装系统就没了
2.远程仓库
也叫中央仓库,它是maven的仓库,如果所用的jar包在本地仓库找不到,则去去远程仓库中下载,到本地仓库中再使用。
在maven的安装目录我的是D:\apache-maven-3.1.1\lib,下一个jar包:maven-model-builder-3.1.1.jar,以解压缩方式打开能看到有一个pom-4.0.0.xml文件,它里面有中央仓库的url:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
http://repo.maven.apache.org/maven2这就是maven的中央仓库
snapshots为false表示下载的为非快照版本,快照版一般为开发版本
3.镜像仓库
所谓镜像,提供其实为中央仓库一样的功能,只不过有时中央仓库访问不了,因为毕竟是国外的,而镜像仓库则是由国内很多厂商提供的,我们使用也很方便,具体用法如下:
修改m2下的settings.xml文件:
在mirrors节点下加入如下配置
<mirror>
<id>maven.net.cn</id>
<mirrorOf>central</mirrorOf>
<name>central mirror in china</name>
<url>;
</mirror>
mirrorOf表示要替换的中央仓库,用了这个配置,那么镜像仓库就会代替我们的中央仓库了。
六、在eclipse中安装maven插件,创建maven项目
一般现在较高版本的eclipse中都集成了maven插件,不需要单独安装了,没有的话,安装也很简单,这里就不多说了。
使用maven创建java项目:
new->maven project->选择maven-artifact-qickstart->输入groupId,artifactId,package
使用maven创建web项目:
new->maven project->选择maven-artifact-webapp->输入groupId,artifactId,package
我们可以看到maven为我们生成的项目目录结构开始讲的:
src
-main
-java
-package
-test
-java
-package
-resources
webapp项目如果没有生成这样的目录,可自行手动创建
还能看到项目根目录下的pom.xml,这就是maven用来构建项目的配置文件
七、pom.xml解析
<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>com.yuwl.maven</groupId>
<artifactId>maven-demo01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven-demo01</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>
<project></project>项目开始结束标签
<modelVersion>maven的版本,固定值为4.0.0
<groupId>组织名:一般为公司网址反写+项目名
<artifaceId>模块名:项目名+模块名
<verison>版本:0.0.1-SNAPSHOT为快照版
<packing>打包方式,有jar,war,pom等,默认为jar
<name><url>作用不大
<properties>为配置信息
如下junit的version3.8.1可以配置为:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.verison>3.8.1</junit.version>
</properties>
使用就可以写成这样:
<version>${junit.verison}</version>
这样做,所有jar包的版本号可以统一管理,改起来也方便
<dependencies>为项目依赖,即引用的外部jar包
八、Maven的生命周期和插件
生命周期一般包含:清理,编译,测试,打包,安装
即clean compile test package install
我们使用时可以clean到任何一个阶段,如
clean compile 包含test
clean package 包含test,compile
clean install 包含test,compile,package
Maven插件:
在pom.xml中由<buid><plugins>标签管理
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase><!-- 运行的阶段 -->
<goals>
<goal>jar-no-fork</goal><!-- 目标 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
如上是一个生成源码打包的插件,Maven提供了很多丰富的插件,他的很多功能其实都是由插件来实现的。
maven自身的插件:http://maven.apache.org/plugins/index.html
还有很多第三方的插件,如jetty,tomcat等
九、依赖传递
即 B依赖A C依赖B,那么C依赖A
如果不想C依赖A,就依赖B,也可以做到,如下:
<dependency>
<groupId>com.yuwl.maven</groupId>
<artifactId>maven-demo02</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.yuwl.maven</groupId>
<artifactId>maven-demo01</artifactId><!-- 排除传递过来的maven-demo01 -->
</exclusion>
</exclusions>
</dependency>
本pom为demo03,依赖demo02,demo02依赖demo01
添加<exclusions>即可排除demo01的依赖
十、依赖冲突
两个原则:
1.短路优先
A->B->C->X.jar
A->D->X.jar(优先使用)
2.先声明,先使用,按先后顺序来
十一、聚合和继承
1.聚合使用<modules>一次性编译,测试,打包,安装
<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>com.yuwl.maven</groupId>
<artifactId>maven-aggreation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>maven-aggreation</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 聚合统一编译,测试,打包,安装 -->
<modules>
<module>../maven-demo01</module>
<module>../maven-demo02</module>
<module>../maven-demo03</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
注意使用聚合时,当前pom的packing必须为pom。
2.继承,类似java的继承,有父子关系
先建一个parent的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>com.yuwl.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>maven-parent</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
<!-- 本项目中不会起作用 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在这个maven-parent中定义了junit依赖,但本项目不会用到这个依赖,在继承的子项目中会用到
<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>
<artifactId>maven-demo01</artifactId>
<packaging>jar</packaging>
<name>maven-demo01</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>com.yuwl.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
maven-demo01继承自maven-parent,可以继承到junit依赖,因此共同的jar包,我们可以放到parent pom中进行管理。
十二、Maven创建web项目,并通过插件发布到jeety,tomcat中
新建maven web项目maven-webdemo,pom.xml如下:
<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.yuwl.maven</groupId>
<artifactId>maven-webdemo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>maven-webdemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId><!-- 解决index.jsp报错 -->
<version>3.0.1</version>
<scope>provided</scope><!-- 只在编译与测试时运行 -->
</dependency>
</dependencies>
<build>
<finalName>maven-webdemo</finalName>
<plugins>
<plugin>
<!-- <groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version> -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<!-- 在打包成功后使用jetty:run来运行服务 -->
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
使用jetty:run来运行,或绑定到package命令上来运行都可以。tomcat插件也可以运行。
总结
这里仅学习Maven最基本的用法,虽然很基础,但很重要,给日常开发项目带来很多便利,后续再进一步补充。