Maven能解决的问题

  • 管理和构建项目

  • 解决jar冲突的问题

  • 解决依赖问题

Maven介绍及环境搭建

  • Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具

  • 下载地址:http://maven.apache.org/download.cgi

  • 解压并配置环境变量

  • 目录说明

    • bin:包含mvn的运行脚本

    • boot:包含一个类加载器的框架,maven使用它加载自己的类库

    • conf:配置文件目录,settings.xml

    • lib:maven运行时用到的类库和第三方依赖类库

  • mvn -v 可以查看到maven的版本号,java版本,系统版本

  • maven项目的目录结构

    • src-->main-->java-->package

    • src--test-->java-->package

    • src--resources

  • 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>test</groupId>
  <artifactId>test01</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <name>test01</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>

常用构建命令

  • 编译项目:mvn compile

  • 运行测试用例:mvn test

  • 打包项目:mvn package

  • 删除target文件夹(字节码文件和测试报告):mvn clean

  • 将jar包安装到本地仓库:mvn install

自动创建目录骨架

  • archetype插件用于创建符合maven规定的目录骨架

  • 创建目录骨架:mvn archety:generate

  • 另一种方式:mvn archety:generate -DgroupId=com.lorinda.demo -DartifactId= mavenDemo -Dversion=1.0.0SNAPSHOT -Dpackage:com.lorinda.cc

    • groupId一般为组织名,公司网址的反写+项目名

    • artifactId一般为项目名-模块名

    • version为版本号

    • 代码所在包名

maven中的坐标和仓库

  • 坐标:任何一个依赖,插件项目构件的输出,所有构件通过坐标作为其唯一标识

标识:

<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>

仓库:用来管理依赖,如果在本地找不到依赖则到maven的全球的中央仓库找,并下载到本地

在maven的settings.xml 文件里配置mirrors的子节点,添加如下mirror:

<mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>                             
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror> 

在eclipse中安装maven插件以及创建maven项目

maven的生命周期和插件

  • 完整的项目构建过程包括:清理,编译,测试,打包,集成测试,验证,部署

  • maven生命周期(相互独立的,后面的依赖前面的)

    • clean 清理项目

      • pre-clean 执行清理钱的工作

      • clean 清理上一次构建生成的所有文件

      • post-clean 执行清理后的工作

    • default 构建项目(最核心)

      • compile

      • test

      • package

      • install

    • site 生成项目站点

      • pre-site 在生成项目站点前要完成的工作

      • site 生成项目站点的文档

      • post-site 在生成项目站点后要完成的工作

      • site-deploy 发布生成的站点到服务器上

  • 在package是打包源码,用的source插件

在pom.xml中

  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

pom.xml常用元素介绍

  • modelVersion指定当前pom版本

  • groupId,artifactId,version,packaging共同组成坐标标识,packaging默认是jar,它还可以打包成war,zip,pom等

  • name:项目描述

  • url:项目的地址

  • description:项目的描述

  • developers:开发人员

  • licenses:许可信息

  • organization:组织信息

  • dependencies:依赖

<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <type></type>
        <scope>依赖的范围</scope>
        <optional>设置依赖是否可选true和false(默认)</optional>
        <exclusions>依赖排除
            <exclusion></exclusion>
        </exclusions>
    </dependency>
</dependencies>
<dependencyManagement>依赖列表,不会被运行,定义在父模块中被子模块继承
    <dependencies>
        <dependency>
        </dependency>
    </dependencies>
</dependencyManagement>
<build>为构建提供支持
    <plugins>插件列表
        <plugin>
            坐标
        </plugin>
    </plugins>
</build>
<parent></parent>
<modules></modules>编译多个模块

依赖范围(scope)

  • 六种classpath

    • compile(默认)

    • provided 在编译和测试时有效

    • runtime 在测试和运行时有效

    • test 只在测试时有效

    • system 在编译和测试时有效,可移植性差

    • import 导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency的配置

依赖传递

  • 使用dependency和坐标指定依赖即可,使用前需要将依赖install

  • 可以exclusions排除依赖

  • 可以自settings.xml中指定jdk版本

依赖冲突

  • 如果有A和B依赖不同版本的相同的构件,对于依赖A和B的C来说,它到底依赖A和B哪个版本的构件?两个原则

    • 短路优先

    • 先声明的优先(xml中的先后顺序)

聚合和继承

  • 新建maven项目(同级),在pom.xml中:packaging更改为pom,添加:
<modules>
<module>../项目名</module>
<module>../项目名</module>
<module>../项目名</module>
</modules>

install就可以一起构建了

  • 新建项目,packaging改为pom,在dependencyManagement中加入
<dependencyManagement>
<dependencies>
        <dependency>
            坐标
        </dependency>
    </dependencies>
</dependencyManagement>

在其他项目中使用patent标签加父类的坐标就可以继承父类了