什么是Maven

Maven是一个跨平台的项目管理工具,主要用于基于Java平台的项目构建,依赖管理。

maven的生命周期和功能
maven的生命周期和功能

maven之前的项目管理一般为 ant

Maven的作用

Maven的出现时为了解决项目的一些问题: 1. 如果有好几个项目,这好几个项目中,需要用到很多相同的jar包, 能不能只建立一个仓库来解决这个问题? 2. 测试方法能不能全部运行呢? 3. 怎么样把一个模块的功能放入到仓库中

Maven的安装和配置

Maven的安装

Jdk要求

jdk要求1.7+

下载Maven

Maven官网上下载最新版本的Maven

设定环境变量

将下载好的Mavenbin追加到环境变量path中。

检查Maven是否配置成功

在cmd中运行mvn -v,当出现下面的提示证明配置正确

注意:要用管理员权限运行cmd,否则会报错

建库

Maven的很大作用就是导入jar包,所以我们建立一个仓库来放置项目所用的jar包,在需要的时候进行管理。

路径

Maven的仓库默认路径是C:\Users\UserName\.m2 ,注:UserName为个人电脑名称

Maven的约定

路径 作用
src/main/java 存放项目的java文件
src/main/resources 存放项目的资源文件,如spring,hibernate的配置文件
src/test/java 存放所有的测试的java文件
src/test/resources 存放测试用的资源文件
target 项目输出位置
pom.xml 文件

必须按照这个约定放置

Maven项目

知道了Maven的约定,那么我们就可以根据约定来进行创建第一个项目。

HelloWorld.java文件

package com.young.maven.model;

public class HelloWorld{
  public String sayHello(){
    return "HelloWorld";
  }
}

HelloWorldTest.java文件

package com.young.maven.model;
import org.junit.*;
import org.junit.Assert.*;


public class HelloWorldTest{
  @Test
  public void testHello(){
    Assert.assertEquals("HelloWorld",new HelloWorld().sayHello());
  }
}

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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.young.maven</groupId>
    <artifactId>maven-model</artifactId>
    <version>1.0-SNAPSHOT</version>
<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
  </dependency>
</dependencies>
</project>

在根目录下执行命令mvn compile

这样就会编译成功。

Maven构建命令

命令 作用
mvn -v 查看maven版本
compile 编译
test 测试
package 打包
clean 删除target
install 安装jar到本地仓库

Maven坐标

        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>

在Mevan中这三个就是基础坐标也是唯一的表示,可以快速定位到任何一个包

仓库

  • 本地仓库
  • 远程仓库
  • 镜像仓库
  • 如果Maven在本地仓库找不到构建,那么就会去Maven的中央仓库去寻找,如果Maven的中央仓库没有,就会报错。因为Maven的远程仓库在国外,常常无法访问或者很慢,这是我们就要使用一些镜像仓库,来帮助我们。 在”~\apache-maven-3.3.9\conf\settings.xml”文件中,找到mirrors,我们可以修改这里进行镜像设置。

Maven中央仓库

中央仓库地址: http://repo.maven.apache.org/

pom.xml

  • project是包含了pom的约束信息
  • modelVersion指定了当前pom的版本
  • groupId当前maven输入那个项目,包名+项目名
  • artifactId项目名+模块名 version版本号,第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号。snapshot快照,alpha内部测试版本,beta公测版本,Relese稳定版本,GA正式发布版本。
  • packaging打包方式,默认为jar包,可以为war,zip
  • name 项目描述
  • url项目地址,项目描述
  • developers 开发人员信息
  • licenses 许可信息
  • organization组织信息
<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <type></type>
        <scope>依赖范围</scope>
        <!--设置依赖是否可选-->
        <optional></optional>
        <!--排除依赖传递列表-->
        <exclusions>
            <exclusion>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
  
  </dependencies>
</dependencyManagement>
<build>
  <plugins>
    <groupId></groupId>
    <artifactId></artifactId>
  </plugins>
</build>
<parent></parent>
<modules></modules>

Maven依赖

依赖范围

scope 控制依赖和三种classpath的关系。

三种classpath 1. 编译 2. 测试 3. 运行

scope一共有6个值分别为compile,provided,runtime,test,system,import

名称 范围
compile 默认的范围,编译测试运行都要效。
provided 在编译和测试有效,运行时无效。
runtime 在测试和运行时有效
test 仅仅在测试有效
system 在本系统有效,移植性非常差
improt 导入范围,它只是用在dependencyManagement中,表示从其他pom.xml继承的依赖。

依赖传递

例如MavenB项目依赖MavenA,而MavenC依赖于MavenB,这样的活那么MavenC就会依赖于MavenA

依赖冲突

A和B依赖不同版本但是相同的构建,就会出现冲突。

处理原则:

  • 断路优先 A->B -> C ->X(jar) A->D->X(jar) 会优先解析路径短的。
  • 先声明先优先 如果两条路径一样,那么先声明的会先依赖。

Maven创建JavaWeb

  • Maven
  • IDEA

创建Maven项目,选择webapp

填写好 GroupIdArtifacetId之后next。
这样我们就完成了一次创建。
因为只为我们创建了resource目录,按照Maven的约定,我们需要创建其他目录。