maven

1. Maven简介

1.1 软件是一个工程

工程说简单点就是各个行业的从业人员通过总结规律或者方法,以最短的时间和人力、物力来做出高效可靠
的东西。
软件工程:为了能够实现软件的流水线式生产,在设计和构建软件时能够有一种规范和工程化的方法,人们
便提出了软件工程概念。

1.2 Maven 概述

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

1.3 Maven 核心概念

Maven能够实现自动化构建是和它的内部原理分不开的,这里我们从 Maven的九个核心概念入手,
看看Maven是如何实现自动化构建的
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合

1.4 安装 Maven 环境

1、 确保安装了 java 环境:maven 本身就是 java 写的,所以要求必须安装 JDK。
查看 java 环境变量:echo %JAVA_HOME%
2、 下载并解压 maven 安装程序:

http://maven.apache.org/download.cgi

3、 配置 Maven 的环境变量:

MAVEN_HOME=d:/apache-maven-3.3.9 或者 M2_HOME=d:/apache-maven-3.3.9
path=%MAVEN_HOME%/bin; 或者%M2_HOME%/bin;

4、验证是否安装成功:
mvn –v

2. Maven 的核心概念:

2.1 Maven 工程约定目录结构

maven 中约定的目录结构:
Hello
|—src
|—|---main
|—|---|—java
|—|---|—resources
|—|---test
|—|---|—java
|—|---|—resources
|—pom.xml
说明:Hello:根目录,也就是工程名
src:源代码
main:主程序
java:主程序的 java 源码
resources:主程序的配置文件
test:测试程序
java:测试程序的 java 源码
resources:测试程序的配置文件
pom.xml:Maven 工程的核心配置文件。
一般情况下,我们习惯上采取的措施是:约定>配置>编码
maven 的 pom.xml 记录的关于构建项目的各个方面的设置,maven 从 pom.xml 文件开始,按照助约定的
工程目录编译,测试,打包,部署,发布项目。

2.1.1 第一个 maven 工程

按照如下步骤,实现第一个 maven 项目,以 maven 推荐的约定方式创建目录,类文件。

  • 1.某个目录中创建文件夹 Hello
  • 2.在 Hello 中创建子目录 src
  • 3.拷贝 pom.xml 到 Hello 目录和 src 是同级放置的。
  • 4.进入 src 目录,创建 main, test 目录
  • 5.进入 main 目录,创建 java,resources 目录。
  • 6.进入 java 目录,创建目录 com/bjpowernode/
  • 7.在 com/bjpowernode/目录下创建 HelloMaven.java 文件,定义 int addNumber(int n1,n2){ return n1+n2};
  • 8.定义 public static void main(String args[]) { System.out.prinltn(“Hello Manven”); //也可以调用 addNumber()方法 } 7.进入到
    Hello 目录在,执行 mvn compile
  • 9.进入到 target/classes 目录执行 java com.bjpowernode.HelloMaven

2.2 POM 文件

即 Project Object Model 项目对象模型。Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中
进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂。所以,maven 环境搭建好之后,所有的学习和
操作都是关于 pom.xml 的。
pom.xml 初识:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.3 仓库

2.3.1 仓库的概念

现在我们对maven工程有一个大概的认识了,那现在思考一个问题,maven怎么就这么神奇,我们写完的工
程交给他之后,他就能够自动帮我们管理,我们依赖的jar包它从哪儿获取呢?有同学说已经安装了,在它的安装
包里啊,大家可以看一下maven下载下来才8M,我们需要的jar包有时候都几百兆甚至几个G,它从哪儿弄去呢?
其实,maven有仓库的概念。在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven
核心程序仅仅定义了自动化构建项目的生命周期,但具体的构建工作是由特定的构件完成的。而且为了提高构建
的效率和构件复用,maven把所有的构件统一存储在某一个位置,这个位置就叫做仓库。

2.3.2 仓库存什么

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

2.3.3 仓库的类别

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

  1. 本地仓库,存在于当前电脑上,默认存放在~\.m2\repository中,为本机上所有的Maven工程服务。你也可以 通过Maven的配置文件Maven_home/conf/settings.xml中修改本地仓库所在的目录。 ~
    是用户的主目录,windows系统中是 c:/user/登录系统的用户名
  2. 远程仓库,分为为全世界范围内的开发人员提供服务的中央仓库、为全世界范围内某些特定的用户提供服务的 中央仓库镜像、为本公司提供服务自己架设的私服。中央仓库是maven默认的远程仓库,其地址
    是:http://repo.maven.apache.org/maven2/
    中央仓库,包含了绝大多数流行的开源Java构件,以及源码、作者信息、许可证信息等。一般来说,简单的
    Java项目依赖的构件都可以在这里下载得到。
  3. 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的
    Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓
    库下载,缓存在私服上之后,再为Maven的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件 上传到私服上
    分类说明:
    1)本地仓库:本机当前电脑上的资源存储位置,为本机上所有 Maven工程提供服务
    2)远程仓库:不在本机上, 通过网络才能使用。多电脑共享使用的。
    ①:中央仓库:通过Internet访问,为全世界所有 Maven工程服务。 最权威的。
    ②:中央仓库的镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库
    的访问,下载的压力。所在洲的用户首先访问的是本洲的镜像服务器。
    ③:私服:在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务。公司中常常使用这种方式。

    在这里插入图片描述

2.3.4 Maven 对仓库的使用

在 Maven 构建项目的过程中如果需要某些插件,首先会到 Maven 的本地仓库中查找,如果找到则可以直接
使用;如果找不到,它会自动连接外网,到远程中央仓库中查找;如果远程仓库中能找到,则先把所需要的插件
下载到本地仓库,然后再使用,并且下次再用到相同的插件也可以直接使用本地仓库的;如果没有外网或者远程
仓库中也找不到,则构建失败。
资源搜索地址:https://mvnrepository.com/

2.4 Maven 的生命周期

对项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,并且对于每一个阶段提供相
对应的命令,对开发者而言仅仅需要掌握一小堆的命令就可以完成项目各个阶段的构建工作。
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪个
阶段,都是从这个生命周期的最初阶段开始的。
对于我们程序员而言,无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前边阶段是
否构建,Maven 都会自动构建。这也就是 Maven 这种自动化构建工具给我们带来的好处

2.5 Maven 的常用命令

Maven 对所有的功能都提供相对应的命令,要想知道 maven 都有哪些命令,那要看 maven 有哪些功能。
一开始就跟大家说了,maven 三大功能:管理依赖、构建项目、管理项目信息。

  1. 管理依赖,只需要声明就可以自 动到仓库下载;
  2. 管理项目信息其实就是生成一个站点文档,一个命令就可以解决,最后再说;
  3. 那 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 所在目录!

2.5.1 练习 maven 命令

以第一个 maven 项目为例,进入到 Hello 目录中执行 maven 各种命令
1.准备工作,pom.xml 添加依赖

<dependencies>
 <!-- 单元测试 -->
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.11</version>
 </dependency>
</dependencies>

2.在 Hello/src/test/目录下创建 java , resources 目录
3.在 Hello/src/test/java 目录下,创建 com/bjpowernode/目录
4. 在 com/bjpowernode/目录中创建 MyTest.java 文件
导入类:

import org.junit.Assert;
import org.junit.Test;
定义方法
public class MyTest {
 @Test
 public void testAddNumber(){
 System.out.println("执行 HelloMaven 类 addNumber()方法");
 int n1 = 10;
 int n2 = 20;
 int res = 0;
 HelloMaven hello =new HelloMaven();
 res = hello.addNumber(n1,n2);

// 期望值,实际值

 Assert.assertEquals(30,res);

5.执行先执行 mvn compile ,观察目录结构的变化,生成 target 目录
6.在执行 mvn clean, 观察 taget 目录被清除
7.执行 mvn compile
8.进入 taget/classes 目录执行 java com.bjpowernode.HelloMaven
9.进入 Hello 目录,执行 mvn test-compile 生成 test-target 测试编译后的目录
10. 进入 Hello 目录,执行 mvn test 执行 MyTest 类中方法,生成测试报告
11.进入目录 surefire-reports,查看测试报告
12.修改 MyTest.java, 增加测试方法

 @Test
 public void testAddNumber2(){
 System.out.println("执行 HelloMaven 类 addNumber()方法");
 int n1 = 20;
 int n2 = 30;
 int res = 0;
 HelloMaven hello =new HelloMaven();
 res = hello.addNumber(n1,n2);

// 期望值,实际值

 Assert.assertEquals(60,res);

}13. 进入 Hello 目录,执行 mvn test-compile
14. 进入 Hello 目录,执行 mvn test
15. 修改 testAddNumber2()方法中 60 为 50
16. 进入 Hello 目录,执行 mvn package ,生成 xxx.jar 文件,这就是所说的打包
17. 进入 Hello 目录,执行 mvn install , 把 xxx.jar 文件安装到本地 maven 仓库,安装成功后查看仓库中的 jar 文 件

2.6 插件

maven 过程构建周期,由 maven 的插件 plugin 来执行完成。
官网插件说明:http://maven.apache.org/plugins/
在项目根目录下执:mvn clean install
在这里插入图片描述
解释说明

2.6.1 clean 插件 maven-clean-plugin:2.5

clean 阶段是独立的一个阶段,功能就是清除工程目前下的 target 目录

2.6.2 resources 插件 maven-resources-plugin:2.6

resource 插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝 src\main\resources 目录下的件到
classes 目录下

2.6.3 compile 插件 maven-compiler-plugin

compile 插件执行时先调用 resouces 插件,功能就是把 src\mainjava 源码编译成字节码生成 class 文件,并把编译好
的 class 文件输出到 target\classes 目录下

2.6.4 test 测试插件

单元测试所用的 compile 和 resources 插件和主代码是相同的,但执行的目标不行,目标 testCompile 和 testResources
是把 src\test\java 下的代码编译成字节码输出到 target\test-classes,同时把 src\test\resources 下的配置文件拷贝到
target\test-classes

2.6.5 package 打包插件 maven-jar-plugin

这个插件是把 class 文件、配置文件打成一个 jar(war 或其它格式)包

2.6.6 deploy 发布插件 maven-install-plugin

发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程
仓库

2.6.7 常用插件

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

<build> 
 <plugins> 
 <plugin> 
 <groupId>org.apache.maven.plugins</groupId> 
 <artifactId>maven-compiler-plugin</artifactId> 
 <version>3.8.1</version> 
 <configuration> 
 <source>1.8</source> 
 <target>1.8</target> 
 </configuration> 
 </plugin> 
 </plugins> 
</build>

2.7 坐标(gav)

Maven 把任何一个插件都作为仓库中的一个项目进行管理,用一组(三个)向量组成的坐标来表示。坐标在仓库
中可以唯一定位一个 Maven 项目。
groupId:组织名,通常是公司或组织域名倒序+项目名
artifactId:模块名,通常是工程名
version:版本号
需要特别指出的是,项目在仓库中的位置是由坐标来决定的:groupId、artifactId 和 version 决定项目在仓库中
的路径,artifactId 和 version 决定 jar 包的名称。

2.8 依赖(dependency)

一个 Maven 项目正常运行需要其它项目的支持,Maven 会根据坐标自动到本地仓库中进行查找。
对于程序员自己的 Maven 项目需要进行安装,才能保存到仓库中。
不用 maven 的时候所有的 jar 都不是你的,需要去各个地方下载拷贝,用了 maven 所有的 jar 包都是你的,想
要谁,叫谁的名字就行。maven 帮你下载
pom.xml 加入依赖的方式:

 log4j 日志依赖
<dependency>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 <version>1.2.17</version>
</dependency>
 junit 单元测试依赖
<dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.11</version>
</dependency>

4.章 依赖管理

4.1 依赖的范围

依赖的范围:compile、test、provided,默认采用 compile
在这里插入图片描述

5.章 Maven 常用设置

5.1 全局变量

在 Maven 的 pom.xml 文件中,用于定义全局变量,POM 中通过${property_name}的形式引用变量的值。
定义全局变量:

<properties>
 <spring.version>4.3.10.RELEASE</spring.version>
</properties>

引用全局变量

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

Maven 系统采用的变量:

<properties>
 <maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本
 <maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱
码
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码
 </properties>

5.2 指定资源位置

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

<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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值