maven基础

Maven简介

Maven概述

官网 : http://maven.apache.org/

Maven是Apache软件基金会组织维护的一.款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是['merv(a)n]或['mevn]。

Maven是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用,Maven是一款在大型项目开发过程中不可或缺的重要工具。

  • Maven可以整合多个项目之间的引用关系,我们可以根据业务和分层需要任意拆分一个项目;
  • Maven提供规范的管理各个常用jar包及其各个版本,并且可以自动下载和引入项目中;
  • Maven可以根据指定版本自动解决jar包版本兼容问题;
  • Maven可以把jar包所依赖的其它jar包自动下载并引入项目。

类似自动化构建工具还有: Ant, Maven, Gradle。

构建( build),是面向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同工作。

构建过程的几个主要环节:

  1. 清理 : 删除以前的编译结果,为重新编译做好准备。
  2. 编译 : 将Java源程 序编译为字节码文件。批量编译为class文件
  3. 测试 : 针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。批量同时测试许多个代码
  4. 报告 : 在每一次测试后以标准的格式记录和展示测试结果。
  5. 打包 : 将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应jar 包,Web工程对应war包。
  6. 安装 : 在Maven环境下特指将打包的结果————jar包或war包 安装到本地仓库中。
  7. 部署 : 将打包的结果部署到远程仓库或将war包部署到服务器上运行

Maven核心概念

Maven能够实现自动化构建是和它的内部原理分不开的

Maven的九个核心概念:
①POM : 一个文件 名称是pom.xml , pom翻译过来叫做项目对象模型。
maven把一个项目当做一个模型使用。控制maven构建项目的过程,管理jar依赖。

②约定的目录结构: maven项目的目录和文件的位置都是规定的

③坐标 :是一个唯一的字符串,用来表示资源的。

④依赖管理 :管理你的项目可以使用jar文件

⑤仓库管理 : 你的资源存放的位置

⑥生命周期 : maven工具构建项目的过程,就是生命周期。

⑦插件和目标 : 执行maven构建的时候用的工具是插件

⑧继承

⑨聚合

Maven工具安装和配置

下载:在官网中下载maven的安装包 apache-maven-3.3.9-bin.zip(推荐使用)

安装:解压安装包

环境变量配置:

  • 在系统的环境变量中,指定一个M2_HOME的名称,值为maven安装路径:D:\Java\maven\apache-maven-3.3.9
  • 再把M2_HOME加入到path之中,在所有路径之前加入 %M2_HOME%\bin;
  • 注意:需要配置JAVA_HOME ,指定jdk路径

验证:在cmd命令行里输入mvn -v,出现如下内容即成功

在这里插入图片描述

Maven核心概念

Maven工程约定目录结构

Hello(项目名称)
	|---src        #源代码
	
	|---|---main     #主程序java代码和配置文件
	
	|---|---|---java   #程序包和包中的java文件
	
	|---|---|---resources #java程序中要使用的配置文件
	
	|---|---test      #放测试程序代码和文件的(可以没有)
	
	|---|---|---java    #测试程序包和包中的java文件
	
	|---|---|---resources #测试java程序中要使用的配置文件
	
	|---pom.xml        #maven的核心文件(maven项目必须有)

一般情况下,习惯上采取的措施是 : 约定>配置>编码

maven的pom.xml记录的关于构建项目的各个方面的设置, maven从pom.xml文件开始,按照助约定的工程目录编译,测试,打包,部署,发布项目。

mvn compile 编译src/main目录下的所有java文件的。

  1. 为什么要下载
    maven工具执行的操作需要很多插件(java类–jar文件)完成的

  2. 下载什么东西了
    jar文件-------叫做插件------插件是完成某些功能

  3. 下载的东西存放到哪里了。

    默认仓库(本机仓库):
    C:\Users\(登录操作系统的用户名)Administrator\.m2\repository

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

  • 执行mvn compile, 结果是在项目的根目录下生成target目录(结果目录),maven编译的java程序,最后的class文件都放在target目录中

仓库

仓库是存放东西的

Maven 仓库的是:

  1. Maven 的插件,插件也是一些 jar,这些 jar 可以完成一定的功能。
  2. 我们自己开发项目的模块
  3. 第三方框架或工具的 jar 包

仓库的类别

根据仓库存储的位置,把仓库分为本地仓库和远程仓库。

本地仓库

  • 为本机上所有的Maven工程服务

  • 默认存放在所在的目录。 c\user\用户名\.m2\repository中。

远程仓库

  • 在互联网上的,使用网络才能使用的仓库

  • 中央仓库,最权威的, 所有的开发人员都共享使用的一个集中的仓库,

  • 中央仓库的镜像:就是中央仓库的备份, 在各大洲,重要的城市都是镜像。

  • 私服,在公司内部,在局域网中使用的, 不是对外使用的。

开发人员需要使用mysql驱动—>maven首先查本地仓库—>私服—>镜像—>中央仓库

修改本地仓库的地址

设置本机存放资源的目录位置(设置本机仓库):

  1. 修改maven的配置文件, maven安装目录/conf/settings.xml
  • 先备份 settings.xml
  1. 修改<localRepository> 指定你的目录(不要使用中文目录)

    <localRepository>D:/Java/maven/maven_repository</localRepository>
    

POM

项目对象模型 Project Object Model

特指的是pom.xml文件

坐标

唯一值, 在互联网中唯一标识一个项目的

modelVersion :Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0

下面三个统称为坐标:(gav)

  • groupId :组织 id,一般是公司域名的倒写。 例如:com.baidu

  • artifactId:项目名称,也是模块名称,对应 groupId 中 项目中的子项目。项目打包后就是这个名字

  • version:项目的版本号。如果项目还在开发中,是不稳定版本, 通常在版本后带-SNAPSHOT

    • version 使用三位数字标识,例如 1.1.0

可以用作自己项目的唯一标识,也可以在依赖中用作依赖包的唯一标识

<modelVersion>4.0.0</modelVersion>
<!-- 坐标(这里是作为项目的唯一标识) -->
<groupId>com.baidu</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>

https://mvnrepository.com/ 搜索使用的中央仓库, 使用groupId 或者 artifactId作为搜索条件

packaging

项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar

web应用是war

packaging 可以不写, 默认是jar

只会打包src/main里面的内容

依赖

dependencies 和dependency ,相当于是 java代码中import

使用标签 dependency 来配置,这种依赖的配置是通过坐标来定位的。

<dependencies>
    
    <!--依赖  java代码中import -->
    <dependency>
        
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.9</version>
        
    </dependency>
    
</dependencies>

配置属性

properties

properties 是用来定 义 一 些 配 置 属 性的,例 如 project.build.sourceEncoding(项目构建源码编码方式),可以设置为 UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。

构建

build

build 表示与构建相关的配置,例如设置编译插件的 jdk 版本

继承

parent

在 Maven 中,如果多个模块都需要声明相同的配置,例如:groupId、 version、有相同的依赖、或者相同的组件配置等,也有类似 Java 的继承机 制,用 parent 声明要继承的父工程的 pom 配置。

聚合

modules

在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有 模块,叫 Maven 的聚合。

Maven生命周期

就是maven构建项目的过程:清理、编译、测试、报告、打包、安装、部署

Maven常用命令

maven独立使用,通过命令,完成maven的生命周期的执行。maven可以使用命令,完成项目的清理,编译,测试等等

  • mvn clean 清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除)
  • mvn compile 编译主程序(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件)
  • mvn test-compile 编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)
  • mvn test 测试(会生成一个目录surefire-reports,保存测试结果)
  • mvn package 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)
  • mvn install 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
  • mvn deploy 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。 还会自动把项目部署到 web 容器中)。

注意:执行以上命令必须在命令行进入 pom.xml 所在目录!

Maven插件

  • clean 插件 maven-clean-plugin:2.5
    • clean 阶段是独立的一个阶段,功能就是清除工程目前下的 target 目录
  • resources 插件 maven-resources-plugin:2.6
    • resource 插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝 src\main\resources 目录下的件到 classes 目录下
  • compile 插件 maven-compiler-plugin
    • compile 插件执行时先调用 resouces 插件,功能就是把 src\mainjava 源码编译成字节码生成 class 文件,并把编译好 的 class 文件输出到 target\classes 目录下
  • test 测试插件
    • 单元测试所用的 compile 和 resources 插件和主代码是相同的,但执行的目标不行,目标 testCompile 和 testResources 是把 src\test\java 下的代码编译成字节码输出到 target\test-classes,同时把 src\test\resources 下的配置文件拷贝到 target\test-classes
  • package 打包插件 maven-jar-plugin
    • 这个插件是把 class 文件、配置文件打成一个 jar(war 或其它格式)包
  • deploy 发布插件 maven-install-plugin
    • 发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程 仓库

常用插件

插件可以在自己的项目中设置,最常使用的是 maven 编译插件。设置项目使用的 jdk 版本时通过编译插件指定。 pom.xml 文件中设置。

<build>
    <!-- 配置插件 -->
    <plugins>
        <!-- 配置具体插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <!-- 插件名称 -->
            <artifactId>maven-compiler-plugin</artifactId>
            <!-- 插件版本 -->
            <version>3.8.1</version>
            <!-- 配置插件的信息 -->
            <configuration>
                <!-- 代码在jdk1.8上编译的 -->
                <source>1.8</source>
                <!-- 需要在jdk1.8上运行 -->
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

其他的插件信息和使用,可以直接上官网查阅 http://maven.apache.org/plugins/

Maven在IDEA中的应用

在idea中设置maven ,让idea和maven结合使用。

idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。

使用自己安装的maven, 需要覆盖idea中的默认的设置。让idea指定maven安装位置等信息

  • 配置的入口 :
    • 配置当前工程的设置, file–settings —Build, Excution,Deployment–Build Tools
    • 配置以后新建工程的设置, file–other settings–Settings for New Project

在这里插入图片描述

在这里插入图片描述

-DarchetypeCatalog=internal 

idea创建maven版java工程

使用模板maven-archetype-quickstart : 普通的java项目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

新建resources文件夹后,需要将其导入到项目中来
在这里插入图片描述

这样整个maven就创建成功了。

在这里插入图片描述

idea创建maven版web工程

使用模板maven-archetype-webapp : web工程

在这里插入图片描述

后面跟上面差不多。

<!-- 加Servlet依赖 -->    
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<!--  加jsp依赖  -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>

依赖管理

依赖的范围

依赖范围, 使用scope表示的。

scope的值有 compile, test, provided , 默认是compile

scope : 表示依赖使用的范围,也就是在maven构建项目的那些阶段中起作用。

compiletestprovided
对主程序是否有效
对测试程序是否有效
是否参与打包
是否参与部署
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>   <!-- 只对测试程序有效 -->
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>   <!-- 对主程序和测试程序有效 -->
</dependency>

你在写项目的中的用到的所有依赖(jar),必须在本地仓库中有。

没有必须通过maven下载, 包括provided的都必须下载。

你在servlet需要继承HttpServlet( provided) , 你使用的HttpServlet是maven仓库中的。

当你的写好的程序, 放到 tomat服务器中运行时, 此时你的程序中不包含servlet的jar。因为tomcat提供了 servlet的.jar

Maven常用设置

全局变量

maven的属性设置

  • <properties> 设置maven的常用属性

    <properties>
    	<!-- 在idea用maven来test在控制台打印的信息不乱码 -->
    	<argLine>-Dfile.encoding=UTF-8</argLine>  
        <!-- 源码编译 jdk 版本 -->
        <maven.compiler.source>1.8</maven.compiler.source> 
        <!-- 运行代码的 jdk 版本 -->
        <maven.compiler.target>1.8</maven.compiler.target> 
        <!-- 项目构建使用的编码,避免中文乱码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
        <!-- 生成报告的编码-->
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    </properties>
    

自定义的属性:

  1. <properties>通过自定义标签声明变量(标签名就是变量名)
  2. 在pom.xml文件中的其它位置,使用 ${标签名} 使用变量的值

自定义全局变量一般是定义 依赖的版本号, 当你的项目中要使用多个相同的版本号,先使用全局变量定义, 在使用${变量名}

示例:

  • 定义全局变量
<properties>
    <spring.version>4.3.10.RELEASE</spring.version>
</properties>
  • 引用全局变量
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

指定资源位置

src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编 译结果分别放到了 target/classes 和 targe/test-classes 目录中,但是src/main/java 和 src/test/java这两个目录中的其他文件都会被忽略掉,如果需要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。以下内容放到 标签中。

默认resources目录下的文件编译后默认都会被放在target/classes目录下。而java目录下的除*.java文件都不会被忽略掉,所以想要不被忽略,就需要在pom.xml中配置如下代码:

  • 注意:下面只是指定了src/main/java的配置文件,所以原先的默认resources目录下文件不会编译,想要保留原来的,可自行再加一个<resources>标签里的内容,设置一下<directory>的目录位置为src/main/resources即可
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory><!--所在的目录-->
            <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <!-- filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
            <filtering>false</filtering>
        </resource>
    </resources>
</build>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值