Maven简介
Maven概述
Maven是Apache软件基金会组织维护的一.款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是['merv(a)n]或['mevn]。
Maven是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用,Maven是一款在大型项目开发过程中不可或缺的重要工具。
- Maven可以整合多个项目之间的引用关系,我们可以根据业务和分层需要任意拆分一个项目;
- Maven提供规范的管理各个常用jar包及其各个版本,并且可以自动下载和引入项目中;
- Maven可以根据指定版本自动解决jar包版本兼容问题;
- Maven可以把jar包所依赖的其它jar包自动下载并引入项目。
类似自动化构建工具还有: Ant, Maven, Gradle。
构建( build),是面向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同工作。
构建过程的几个主要环节:
- 清理 : 删除以前的编译结果,为重新编译做好准备。
- 编译 : 将Java源程 序编译为字节码文件。批量编译为class文件
- 测试 : 针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。批量同时测试许多个代码
- 报告 : 在每一次测试后以标准的格式记录和展示测试结果。
- 打包 : 将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应jar 包,Web工程对应war包。
- 安装 : 在Maven环境下特指将打包的结果————jar包或war包 安装到本地仓库中。
- 部署 : 将打包的结果部署到远程仓库或将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文件的。
-
为什么要下载
maven工具执行的操作需要很多插件(java类–jar文件)完成的 -
下载什么东西了
jar文件-------叫做插件------插件是完成某些功能 -
下载的东西存放到哪里了。
默认仓库(本机仓库):
C:\Users\(登录操作系统的用户名)Administrator\.m2\repository
https://repo.maven.apache.org :中央仓库的地址
- 执行
mvn compile
, 结果是在项目的根目录下生成target目录(结果目录),maven编译的java程序,最后的class文件都放在target目录中
仓库
仓库是存放东西的
Maven 仓库的是:
- Maven 的插件,插件也是一些 jar,这些 jar 可以完成一定的功能。
- 我们自己开发项目的模块
- 第三方框架或工具的 jar 包
仓库的类别
根据仓库存储的位置,把仓库分为本地仓库和远程仓库。
本地仓库:
-
为本机上所有的Maven工程服务
-
默认存放在所在的目录。
c\user\用户名\.m2\repository
中。
远程仓库:
-
在互联网上的,使用网络才能使用的仓库
-
中央仓库,最权威的, 所有的开发人员都共享使用的一个集中的仓库,
- https://repo.maven.apache.org :中央仓库的地址
-
中央仓库的镜像:就是中央仓库的备份, 在各大洲,重要的城市都是镜像。
-
私服,在公司内部,在局域网中使用的, 不是对外使用的。
开发人员需要使用mysql驱动—>maven首先查本地仓库—>私服—>镜像—>中央仓库
修改本地仓库的地址
设置本机存放资源的目录位置(设置本机仓库):
- 修改maven的配置文件,
maven安装目录/conf/settings.xml
- 先备份 settings.xml
-
修改
<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构建项目的那些阶段中起作用。
compile | test | provided | |
---|---|---|---|
对主程序是否有效 | 是 | 否 | 是 |
对测试程序是否有效 | 是 | 是 | 是 |
是否参与打包 | 是 | 否 | 否 |
是否参与部署 | 是 | 否 | 否 |
<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>
自定义的属性:
- 在
<properties>
通过自定义标签声明变量(标签名就是变量名) - 在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>