第 2 章 Maven的核心概念

2.1 Maven工程约定目录结构

  • maven中约定的目录结构,约定是大家都遵循的一个规则。

  • 每一个 maven 项目在磁盘中都是一个文件夹(项目-Hello)
    Hello
    |—src
    |—|---main
    |—|---|—java
    |—|---|—resources
    |—|---test
    |—|---|—java
    |—|---|—resources
    |—pom.xml

  • 说明:

    • Hello:根目录,也就是工程名
    • src:源代码
      • main:放主程序java代码和配置文件
        • java:主程序的java源码
        • resources:主程序的配置文件
      • test:放测试程序代码和文件的
        • java:测试程序的java源码
        • resources:测试程序的配置文件
    • pom.xml:Maven工程的核心配置文件。

2.1.1 第一个 maven工程

  • 按照如下步骤,实现第一个 maven 项目,以 maven推荐的约定方式创建目录,类文件。
  1. 某个目录中创建文件夹 Hello,在 Hello中创建子目录 src
  2. 拷贝 pom.xml 到 Hello目录和 src是同级放置的。
  3. 进入 src目录,创建 main、test目录
  4. 进入 main目录,创建 java、resources目录。
  5. 进入 java 目录,创建 目录 com/mycode/
  6. 在 com/mycode/目录下创建 HelloMaven.java文件
package com.mycode;
public class HelloMaven {
    
    
	public int add(int n1, int n2) {
    
    
		return n1 + n2;
	}

	public static void main(String args[]){
    
    
		HelloMaven hello = new HelloMaven();
		int res = hello.add(10, 20);
		System.out.println("10 + 20 = " + res);
	}
}
  1. 进入到 Hello目录在,执行 mvn compile,编译 src/main 目录下的所有java文件。
    疑问:
    ①为什么要下载?
    maven工具执行的操作需要很多的插件(java类–jar文件)完成的
    ②下载了什么东西?
    jar文件----叫做插件----插件是完成某些功能
    ③下载的东西存在哪?
    默认仓库(本机仓库):
    C:\Users\Jay.m2\repository
    Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-repository-metadata/2.0.9/maven-repository-metadata-2.0.9.jar
    https://repo.maven.apache.org/:中央仓库的地址
    执行 mvn compile,结果是在项目的根目录下生成 target 目录(结果目录),maven 编译的 java 程序,最后的 calss 文件都放在 target 目录中
  2. 进入到 target/classes目录执行 java com.mycode.HelloMaven

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

  1. 修改 maven 的配置文件,maven 安装目录/conf/settings.xml
    先备份 settings.xml
  2. 修改 <localRepository> 来指定你的目录(不要使用中文目录)
    D:\Maven\maven_repository
    在这里插入图片描述

2.2 仓库

2.2.1 仓库的概念

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

2.2.2 仓库存什么

仓库是存放东西的,Maven仓库存的是:

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

2.2.3 仓库的类别

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

  • 本地仓库 ,存在于当前电脑上 ,默认存放在 ~.m2\repository中 ,为本机上所有的 Maven工程服务。你也可以通过 Maven 的配置文件 Maven_home/conf/settings.xml中修改本地仓库所在的目录。
    ~ 是用户的主目录, windows系统中是 c::/user/登录系统的 用户名

  • 远程仓库 ,分为为全世界范围内的开发人员提供服务的中央仓库、为全世界范围内某些特定的用户提供服务的中央仓库镜像、为本公司提供服务自己架设的私服。中央仓库是 maven默认的远程仓库,其地址是 :http://repo.maven.apache.org/maven2/

    • 中央仓库 包含了绝大多数流行的开源 Java构件,以及源码、作者信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载得到。
    • 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为 Maven的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。
  • 分类说明:

  1. 本地仓库:本机当前电脑上的资源存储位置,为本机上所有 Maven工程提供服务
  2. 远程仓库:不在本机上, 通过网络才能使用。多电脑共享使用的。
    ①:中央仓库:通过Internet访问,为全世界所有 Maven工程服务。 最权威的。
    ②:中央仓库的镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库的访问,下载的压力。所在洲的用户首先访问的是本洲的镜像服务器。
    ③:私服:在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务。公司中常常使用这种方式。
    在这里插入图片描述

2.2.4 Maven对仓库的使用

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

    扫描二维码关注公众号,回复: 12837197 查看本文章
  • 资源搜索地址:https://mvnrepository.com/ 搜索使用的中央仓库,使用groupId 或者 artifactId 作为搜索条件

2.3 POM文件

  • POM 即 Project Object Model 项目对象模型。Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂。所以,maven 环境搭建好之后,所有的学习和操作都是关于 pom.xml 的。
  • pom.xml初识:
    在这里插入图片描述
    在这里插入图片描述
  1. 坐标:唯一值,在互联网中唯一标识一个项目的
    <groupId>公司域名的倒写</groupId>
    <artifactId>自定义项目名称</artifactId>
    <version>自定义版本号</version>
  2. packaging:打包后压缩文件的扩展名,默认是 jar,web 应用是 war
    packaging 可以不写,默认是 jar
  3. 依赖:dependencies 和 dependency,相当于是 java 代码中的 import
    项目中要使用的各种资源说明,比如 mysql 驱动
<dependencies>
	<dependency>
	    <groupId>mysql</groupId>
	    <artifactId>mysql-connector-java</artifactId>
	    <version>5.1.9</version>
	</dependency>
</dependencies>
  1. properties:设置属性
  2. build:maven 在进行项目构建时,配置信息,例如指定编译 java 代码使用的 jdk 的版本等

2.4 Maven的生命周期

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

2.5 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所在目录!

2.5.1 练习maven命令

以第一个 maven 项目为例,进入到 Hello 目录中执行 maven 各种命令

  1. 准备工作 pom.xml 添加依赖
    在这里插入图片描述
  2. 在 Hello/src/test/ 目录下创建 java、resources目录
  3. 在 Hello/src/test/java 目录下,创建 com/mycode/ 目录
  4. 在 com/mycode/ 目录中创建测试程序
    推荐的创建类和方法的提示:
    ① 测试类的名称:Test + 你要测试的类名
    ② 测试的方法名称:test + 方法名称
package com.mycode;
// 导入类
import org.junit.Assert;
import org.junit.Test;

// 定义方法
public class TestHelloMaven{
    
    
	
	@Test
	public void testAdd(){
    
    
		System.out.println("===maven junit 的 testAdd()===");
		HelloMaven hello = new HelloMaven();
		int res = hello.add(10, 20);
		// 验证10+20是不是30?junit提供的方法,对比结果
		// assertEquals(期望值, 实际值),如果两个值相等证明是正确的,不等就抛异常,错误了
		Assert.assertEquals(30, res);
	}
}
  1. 执行 mvn compile
    编译 main/java/ 目录下的 java 为 class 文件,同时把 class 拷贝到 target/classes 目录下面
    把 main/resources 目录下的所有文件都拷贝到 target/classes 目录下
  2. 执行 mvn clean 观察 taget目录被清除
  3. 执行 mvn compile
  4. 进入 taget/classes 目录执行 java com.bjpowernode.HelloMaven
  5. 进入 Hello 目录,执行 mvn test-compile 生成 target/test-target 测试编译后的目录
  6. 进入 Hello 目录,执行 mvn test 执行 TestHelloMaven 类中方法,生成测试报告
  7. 进入 目录 surefire reports 查看测试报告
    在这里插入图片描述
  8. 修改 MyTest.java, 增加测试方法
	@Test
	public void testAdd2(){
    
    
		System.out.println("###maven junit 的 testAdd()2###");
		HelloMaven hello = new HelloMaven();
		int res = hello.add(10, 20);
		// 验证10+20是不是30?junit提供的方法,对比结果
		// assertEquals(期望值, 实际值),如果两个值相等证明是正确的,不等就抛异常,错误了
		Assert.assertEquals(50, res);
	}
  1. 进入 Hello 目录,执行 mvn test,此时会把前面的周期内容都执行一遍
    在这里插入图片描述
  2. 将代码改正确,执行 mvn test
    在这里插入图片描述
    在这里插入图片描述
  3. 进 入 Hello目录,执行 mvn package ,生成 xxx.jar文件,这就是所说的打包
    在这里插入图片描述
    16)进入 Hello 目录,执行 mvn install 把 xxx.jar文件安装到本地 maven 仓库,安装成功后查看仓库中的 jar 文件
    在这里插入图片描述
    在这里插入图片描述
    在其他项目中使用使用:
<dependency>
	<groupId>com.mycode</groupId>
	<artifactId>ch01-maven</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>

2.6 插件

  • maven 过程构建周期, 由 maven 的插件 plugin 来执行完成 。
  • 官网插件说明:http://maven.apache.org/plugins/
  • 在项目根目录下执:mvn clean install
    在这里插入图片描述
  1. clean 插件 maven clean plugin:2.5
    clean阶段是独立的一个阶段,功能就是清除工程目前下的 target目录
  2. resources插件 maven resources plugin:2.6
    resource插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝 src\main\resources 目录下的件到 classes 目录下
  3. compile插件 maven compiler plugin
    compile插件执行时先调用 resouces 插件,功能就是把 src\mainjava 源码编译成字节码生成 class 文件,并把编译好的 class 文件输出到 target\classes 目录下
  4. test 测试插件
    单元测试所用的 compile 和 resources 插件和主代码是相同的,但执行的目标不行,目标 testCompile 和 testResources 是把 src\test\java 下的代码编译成字节码输出到 target\test classes,同时把 src\test\resources 下的配置文件拷贝到 target\test classes
  5. package 打包插件 maven jar plugin
    这个插件是把 class 文件、配置文件打成一个 jar(war或其它格式 )包
  6. deploy 发布插件 maven install plugin
    发布插件的功能就是把构建好的 artifact部署到本地仓库,还有一个 deploy插件是将构建好的 artifact部署到远程仓库
  • 常用插件
    插件可以在自己的项目中设置, 最常使用的是 maven 编译插件。设置项目使用的 jdk版本时通过编译插件指定。pom.xml文件 <build>中设置。
<!-- 控制配置maven构建项目的参数设置,设置jdk的版本 -->
<build>
	<!-- 配置插件 -->
	<plugins>
		<!-- 配置具体的插件 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<!-- 插件名称 -->
			<artifactId>maven-compiler-plugin</artifactId> 
			<!-- 插件版本 -->
			<version>3.8.13.8.1</version>
			<!-- 配置插件的信息 -->
			<configuration>
				<!-- 告诉maven我们写的代码是在jdk1.8上编译的 -->
				<source>1.8</source>
				<!-- 我们的程序应该运行在1.8的jdk上 -->
				<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加入依赖的方式:
<dependencies>
	<!-- https://mvnrepository.com/artifact/junit/junit -->
	<dependency>
	    <groupId>junit</groupId>
	    <artifactId>junit</artifactId>
	    <version>4.12</version>
	    <scope>test</scope>
	</dependency>
</dependencies>

猜你喜欢

转载自blog.csdn.net/Lu1048728731/article/details/114748984