Maven基础

Maven基础

1.Maven简介

Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)

Maven是用Java语言编写的。他管理的东西统统以面向对象的形式进行设计,最终他把一个项目看成一个对象,而这个对象叫做POM(project object model),即项目对象模型

  • 依赖管理就是maven对项目所有依赖资源的一种管理,它和项目之间是一种双向关系。
  • maven依赖管理存储三个位置:本地仓库,私服,中央仓库
  • Maven除了帮我们管理项目资源之外还能帮助我们对项目进行构建,管理项目的整个生命周期.

Maven的作用

(1)项目构建:提供标准的,跨平台的自动化构建项目的方式

(2)依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突等问题

(3)统一开发结构:提供标准的,统一的项目开发结构

各目录存放资源类型说明:

src/main/java:项目java源码

src/main/resources:项目的相关配置文件(比如mybatis配置,xml映射配置,自定义配置文件等)

src/main/webapp:web资源(比如html,css,js等)

src/test/java:测试代码

src/test/resources:测试相关配置文件

src/pom.xml:项目pom文件

2.Maven环境搭建

maven的官网地址

官方下载地址

apache-maven-3.6.1-bin.zip直接解压到D盘根目录下即可

各目录结构说明:

bin:可执行程序目录,

boot:maven自身的启动加载器

conf:maven配置文件的存放目录

lib:maven运行所需库的存放目录

需要java环境,java环境配置点此链接

maven环境变量配置

此电脑右键属性->高级系统设置->环境变量->系统变量

变量名:MAVEN_HOME

变量值:D:\maven\apache-maven-3.3.9

变量名:Path

变量值:%MAVEN_HOME%\bin

验证:win + R -> cmd -> mvn -v

出现:Apache Maven 3.3.9则安装成功

3.Maven基础概念

仓库:用于存储资源,主要是各种jar包

中央仓库:maven团队自身维护的仓库,属于开源的

私服:各公司/部门等小范围内存储资源的仓库,私服也可以从中央仓库获取资源

本地仓库:开发者自己电脑上存储资源的仓库,也可从远程仓库获取资源

坐标:maven中的坐标用于描述仓库中资源的位置

坐标作用:使用唯一标识,唯一性定义资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。

jar包下载地址

groupId:定义当前资源隶属组织名称(通常是域名反写,如:org.mybatis)

artifactId:定义当前资源的名称(通常是项目或模块名称,如:crm,sms)

version:定义当前资源的版本号

packaging:定义资源的打包方式,取值一般有如下三种

(1)jar:该资源打成jar包,默认是jar

(2)war:该资源打成war包

(3)pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml不生成jar或其他包结构

maven资源坐标点此链接常用

仓库配置

选择在全局进行配置,在maven的配置文件conf/settings.xml中可以找到它的说明,在系统盘当前用户目录下的.m2/repository

默认位置

<localRepository>C:\Users\${user.home}\.m2\repository</localRepository>

指定一个新的位置作为本地仓库的位置:maven配置文件conf/settings.xml中添加

<localRepository>D:\maven-repository</localRepository>

局部用户配置:在仓库的同级目录也可以包含一个settings.xml配置文件,在里面也可以进行指定.

maven默认连接的远程仓库位置是:(即中央仓库);可以配置一个国内站点镜像,可用于加速下载资源.

conf/settings.xml配置文件中找到<mirrors>标签,在这组标签下添加镜像的配置

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

4.Maven项目搭建

通过maven来构建项目

mvn compile:编译

mvn clean:清理

mvn test:测试

mvn package:打包

mvn install:安装到本地仓库

(1)win+R然后cmd进入项目文件中pom.xml文件所在目录,执行mvn compile进行源码编译

目录target下存放的是maven编译好的一些东西,其中生成的classes目录就是编译好的字节码文件.

(2)如果想清理掉这些东西,只需执行mvn clean命令即可,清理掉后target目录也就消失了

(3)如果要执行测试包中的测试程序,只需执行mvn test命令即可

此时在看target目录会多一些东西,其中产生的test-classes就是测试代码的字节码文件,surefire-reports是它产生的测试报告.

(4)使用mvn package命令进行打包;执行mvn package命令的时候maven会把前面两个命令mvn compile,mvn test都执行一遍

(5)使用mvn install命令进行安装,将项目打好的包存入本地仓库

maven是按照groupId/artifactId/version的结构在本地仓库进行存储

maven项目搭建方式:
  • 手动搭建,创建文件夹的方式
  • 插件搭建,通过mvn命令调用插件搭建
  • Idea搭建,常用

IDEA工具搭建maven项目

注意:Maven和IDEA在版本上存在一些兼容性问题,要合理的选择Maven和IDEA的版本

不使用原型创建项目

(1)在IDEA中配置Maven

(2)创建maven工程

(3)查看各目录颜色标记是否正确

(4)IDEA右侧有一个maven管理界面,可点开查看

(5)在项目的pom.xml文件中添加项目资源依赖

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

(6)java中创建源代码

package com.emprock;

public class Main {
    public String say(String name){
        System.out.println("hello "+name);
        return "hello "+name;
    }
}

(7)test中创建测试代码

package com.emprock;

import org.junit.Assert;
import org.junit.Test;

public class ApplicationTest {
    @Test
    public void testSay(){
        Main d = new Main();
        String ret = d.say("maven");
        Assert.assertEquals("hello maven",ret);
    }
}

(8) 进行测试运行

(9)编辑运行模板运行

使用原型创建项目

(1)创建maven项目的时候选择使用原型骨架

常用的选择maven-archetype-quickstart或者maven-archetype-webapp

(2)需要手动去补全目录,并且要对补全的目录进行标记,切记

固定需要的目录结构有

  • 创建java代码(源代码)所在目录,即创建src/main/java
  • 创建配置文件所在目录,即创建src/main/resources
  • 创建测试源代码所在目录,即创建src/test/java (非必需)
  • 创建测试存放配置文件存放目录,即src/test/resources (非必需)
  • src/main/java 中创建包及.java文件

(3)web工程创建好之后需要启动运行,需要使用一个tomcat插件来运行项目,在pom.xml中添加插件的坐标即可,最终改好的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><!--指定pom的模型版本-->
  <groupId>org.example</groupId><!--组织id-->
  <artifactId>maven-hello</artifactId><!--项目id-->
  <packaging>war</packaging><!--打包方式,web工程打包为war,java工程打包为jar-->
  <version>1.0-SNAPSHOT</version><!--版本号-->
  <name>maven-hello Maven Webapp</name><!--项目名-->
  <url>http://maven.apache.org</url>
  <dependencies><!--设置当前工程的所有依赖-->
    <dependency><!--具体的依赖-->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build><!--构建-->
    <finalName>maven-hello</finalName>
    <plugins><!--设置插件-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
      </plugin>
    </plugins>
  </build>
</project>

(4)插件配置好后,在IDEA右侧maven-project操作面板上可以看到该插件,并且可以利用该插件启动项目,并在浏览器中访问地址

如果我们想更换端口,只需要在pom.xml中配置该插件即可

      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>80</port>
        </configuration>
      </plugin>

(5)同时为了运行方便我们也可以创建运行模板:

5.Maven依赖管理

依赖配置

依赖是指在当前项目中运行所需的jar,依赖配置的格式如下:

xml 复制代码
    <!--设置当前项目所依赖的所有jar-->
    <dependencies>
      <!--设置具体的依赖-->
        <dependency>
          	<!--依赖所属群组id-->
            <groupId>junit</groupId>
          	<!--依赖所属项目id-->
            <artifactId>junit</artifactId>
          	<!--依赖版本号-->
            <version>4.12</version>
        </dependency>
    </dependencies>

依赖传递:

(1)直接依赖:在当前项目中通过依赖配置建立的依赖关系

(2)间接依赖:被依赖的资源如果依赖其他资源,则表明当前项目间接依赖其他资源

依赖传递的冲突优先级:

(1)路径优先:当依赖中出现相同资源时,层级越深,优先级越低,反之则越高

(2)声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖靠后的

(3)特殊优先:当同级配置了相同资源的不同版本时,后配置的覆盖先配置的

可选依赖

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!--对外隐藏当前所依赖的资源-->
            <optional>true</optional>
        </dependency>

排除依赖:

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!--主动断开依赖的资源,被排除的资源无需指定版本-->
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

依赖范围

依赖的jar默认情况可以在任何地方可用,可以通过scope标签设定其作用范围

有三种范围

(1)主程序范围有效(src/main目录范围内)

(2)测试程序范围内有效(src/test目录范围内)

(3)是否参与打包(package指令范围内)

此外:scope标签的取值有四种:compile,test,provided,runtime

compile(默认)权限123

test权限2

provided权限12

runtime权限3

6.Maven生命周期与插件

**生命周期 **

maven的构建生命周期描述的是一次构建过程经历了多少个事件,总共分为3套,每套里面包含的事件简略版如下

(1)clean:清理工作

clean:移除上一次构建产生的所有文件

(2)default:核心工作,例如编译,测试,打包,部署等

compile:编译

test-compile:编译测试源码

test:测试

package:打包

install:安装到本地仓库

对于default生命周期,每个事件在执行之前都会将之前的所有事件依次执行一遍

(3)site:产生报告,发布站点等

site:生成项目的站点文档

site-deploy:将生成的站点文档部署到特定的服务器上

插件

执行事件

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件
  • maven默认在各个生命周期上都绑定了预先设定的插件来完成相应功能
  • 插件还可以完成一些自定义功能

案例:

    <plugins>
      <plugin>
        <!--添加source执行位置插件-->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
        <executions>
          <execution>
            <goals>
              <goal>jar</goal>
            </goals>
            <phase>generate-test-resources</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>

在maven官网中有对插件的介绍地址

相关推荐
杨荧1 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的宠物咖啡馆平台
java·开发语言·jvm·vue.js·spring boot·spring cloud·开源
Ling_suu32 分钟前
Spring——单元测试
java·spring·单元测试
ModelBulider34 分钟前
十三、注解配置SpringMVC
java·开发语言·数据库·sql·mysql
苹果酱05671 小时前
C语言 char 字符串 - C语言零基础入门教程
java·开发语言·spring boot·mysql·中间件
csucoderlee1 小时前
eclipse mat leak suspects report和 component report的区别
java·ide·eclipse
代码小鑫1 小时前
A032-基于Spring Boot的健康医院门诊在线挂号系统
java·开发语言·spring boot·后端·spring·毕业设计
训山1 小时前
4000字浅谈Java网络编程
java·开发语言·网络
VertexGeek1 小时前
Rust学习(四):作用域、所有权和生命周期:
java·学习·rust
喔喔咿哈哈2 小时前
【手撕 Spring】 -- Bean 的创建以及获取
java·后端·spring·面试·开源·github
码农小丘2 小时前
了解springboot国际化用途以及使用
java·spring boot·spring