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最基本的用法,虽然很基础,但很重要,给日常开发项目带来很多便利,后续再进一步补充。