lxmyhappy

超详细的Maven使用教程

什么是Maven?

如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。

以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。

而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。

安装Maven 和 Maven的Eclipse插件

http://blog.csdn.net/qjyong/article/details/9098213

Maven规定的目录结构

若要使用Maven,那么项目的目录结构必须符合Maven的规范,其目录结构如下:

Maven基本命令

  1. -v:查询Maven版本

    本命令用于检查maven是否安装成功。

    Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。

  2. compile:编译

    将java源文件编译成class文件

  3. test:测试项目

    执行test目录下的测试用例

  4. package:打包

    将项目打成jar包

  5. clean:删除target文件夹

  6. install:安装

    将当前项目放到Maven的本地仓库中。供其他项目使用

什么是Maven仓库?

Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。

  • 本地仓库 
    Maven本地的Jar包仓库。
  • 中央仓库 
    Maven官方提供的远程仓库。

当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。

什么是“坐标”?

在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。

如下代码中,groupId和artifactId构成了一个Jar包的坐标。

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.1</version>
</dependency>
  • groupId:所需Jar包的项目名
  • artifactId:所需Jar包的模块名
  • version:所需Jar包的版本号

传递依赖 与 排除依赖

  • 传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用的Jar包都下载到本地。
  • 排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
<exclusions>
    <exclusion>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </exclusion>
</exclusions>

依赖冲突

若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。

  • 短路优先
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar

若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。

在此时,Maven只会引用引用路径最短的Jar。

  • 声明优先

    若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。

聚合

  1. 什么是聚合?

    将多个项目同时运行就称为聚合。

  2. 如何实现聚合?

    只需在pom中作如下配置即可实现聚合:

<modules>
        <module>../模块1</module>
        <module>../模块2</module>
        <module>../模块3</module>
    </modules>

继承

  1. 什么是继承?

    在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。

  2. 如何实现继承?

    • 父pom配置:将需要继承的Jar包的坐标放入标签即可。
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>1.2.2</version>
            </dependency> 
        </dependencies>
    </dependencyManagement>
  • 子pom配置:
<parent>
    <groupId>父pom所在项目的groupId</groupId>
    <artifactId>父pom所在项目的artifactId</artifactId>
    <version>父pom所在项目的版本号</version>
</parent>

使用Maven构建Web项目

  1. New Maven项目:选择WebApp:

  2. 若使用JSP,需添加Servlet依赖:

    注:Servlet依赖只在编译和测试时使用!

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <!-- 只在编译和测试时运行 -->
    <scope>provided</scope>
</dependency>
  1. 在Bulid Path中设置resource输出目录:

  2. 勾选:Dynamic Web Module

  3. 删掉测试目录

  4. 在pom中加入jetty的插件,并设置JDK版本:

<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.3.10.v20160621</version>
            <executions>
                <execution>
                    <phase>package</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
  1. 运行项目:

  2. 输入:jetty:run

  3. 访问127.0.0.1:8080

    若出现如下界面,表示成功!

pom.xml详解

pom.xml是Maven的核心,你的项目需要什么Jar包就在pom.xml里面配置。当编译项目时Maven读取该文件,并从仓库中下载相应的Jar包。

<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.0http://maven.apache.org/maven-v4_0_0.xsd">     
    <!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。-->    
    <parent>    
     <!--被继承的父项目的构件标识符-->    
     <artifactId/>    
     <!--被继承的父项目的全球唯一标识符-->    
     <groupId/>    
     <!--被继承的父项目的版本-->    
     <version/>    
     <!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项 目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。-->    
     <relativePath/>    
 </parent>    
 <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。-->       
    <modelVersion>4.0.0</modelVersion>     
    <!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app-->     
    <groupId>cn.erhuowang</groupId>     
    <!-- 构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个 特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。-->     
    <artifactId>erhuowang-maven2</artifactId>     
    <!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型-->     
    <packaging>war</packaging>     
    <!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号-->     
    <version>1.0-SNAPSHOT</version>     
    <!--项目的名称, Maven产生的文档用-->     
    <name>erhuo-maven</name>     
    <!--项目主页的URL, Maven产生的文档用-->     
    <url>http://erhuowang.cn</url>     
    <!-- 项目的详细描述, Maven 产生的文档用。  当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标 签), 不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。-->     
    <description>A maven project to study maven.</description>     
    <!--描述了这个项目构建环境中的前提条件。-->    
 <prerequisites>    
  <!--构建该项目或使用该插件所需要的Maven的最低版本-->    
    <maven/>    
 </prerequisites>    
 <!--项目名称和URL-->     
    <issueManagement>    
     <!--项目名字,-->     
        <system>erhuowang</system>     
        <!--该项目使用的URL-->    
        <

分类:

技术点:

相关文章: