项目的管理工具 ----- Maven

项目的管理工具 ----- Maven,第1张

项目的管理工具 ----- Maven

Maven

内容导航
  • Maven
      • 构建项目
    • 软件工程
    • Maven工具的安装和配置
    • Maven core
      • POM 【program object model】项目对象模型
      • 约定的目录结构 【maven编写项目的常见问题】
      • 坐标gay
      • 依赖管理【dependencies(管理)----> dependency(依赖从属)】
      • 仓库管理
      • 生命周期
      • ....Maven常用的命令
      • 插件
      • 继承和聚合
    • 单元测试框架Junit【测试方法】

Javaweb — 现在准备沉淀一下进入框架


Maven


JQuery虽然都说过时了,但是真的还是比JS高明了许多,特别是对于AJAX的简化;而JDK的动态代理则是基于反射实现了动态扩展而不改变原有的功能【但是必须要有接口】

maven是一个辅助的管理项目的工具【just 辅助】;最主要的功能–> 管理依赖(下载管理项目的jar包;Maven Repository: Search/Browse/Explore (mvnrepository.com);在这里面就可以找到;通过gruopId、artifactId、version可以唯一找到一个资源jar包);第二个便是项目的构建(编译、测试、打包、部署)

而其使用方式: 1. 通过命令行窗口使用lib命令完成比如编译命令【mvn -compile】来完成 *** 作 2.配置开发工具使用,比如IDEA、Eclipse,非常简单快捷

Maven

在最开始写java的基础的简单的项目的时候,就会有提示,是否创建Maven,那么什么是Maven呢?

传统的项目 :

  1. 有很多模块、模块之间有关系、手工管理关系,比较繁琐
  2. 需要很多第三方功能,所以需要直到很多jar文件,需要从网络中获取各个jar,比如mysql,servlet等【jar文件中有很多的class类】
  3. 需要管理jar的版本,比如需要5.0,那就不能使用4.0的;因为版本冲突会出现问题
  4. 管理jar文件之间的依赖。比如要使用a.jar,必须使用b.jar中的类,必须要先得到b.jar,然后次啊能使用a.jar;a.jar和b.jar的关系就是依赖,就两者有关系就产生了依赖,比如a.jar依赖b.jar;项目依赖mysql驱动【因此开发项目需要对各jar包之间的依赖关系非常清楚,但这很耗费时间,所以如果能有工具帮忙就好了】

所以需要使用Maven来改进项目

  1. mavaen可以管理jar文件
  2. 自动下载jar和他的文档,源代码
  3. 管理jar直接的依赖,a.jar需要b.jar,maven会自动给下载b.jar
  4. 管理需要的jar的版本
  5. 自动编译程序和测试程序
  6. 帮助打包文件,形成jar文件、或者war文件
  7. 还能够帮助部署项目

这样开发者就只需要写功能代码即可

构建项目

构建是面向过程的,就是一些步骤,完成代码的编译、测试、运行、打包、部署等;maven支持的有

  1. 清理 : 将之前项目的编译的文件删除,为新的编译代码做准备
  2. 编译 :把程序源代码编译为执行代码,java—>class文件【这是批量 *** 作,javac一次只能编译一个】
  3. 测试: maven可以只从测试程序代码,验证功能是否正确【批量 *** 作,同时测试多个测试代码,测试多个功能】
  4. 报告 : 生成测试结果的文件,测试是否通过的信息
  5. 打包: 将项目中的所有的class文件,配置文件等所有资源放到一个压缩文件中,如果都是普通的java程序,那么就是jar文件,web应用就是war文件 ---- 一个文件就是一个独立的功能了
  6. 安装 : 将5中生成的压缩文件安装到本机仓库
  7. 部署: 把项目安装好可以执行
软件工程

再介绍这个知识之前,先来提出一个概念:软件工程【刚好下学期有这个课程,到时候会单独再介绍一下的】 日常生活中,有很多的工程项目,比如桥梁工程;工程就是各个行业的从业人员通过总结的规律和方法,以最小的代价做出最大的成效。 所谓的桥梁工程就是人们通过经验和总结得出的 — 用来建造桥梁最高效的方法,这种方法是可复用的。将这种思想抽象到软件领域,就变成了软件工程

软件工程 ---- 为了实现软件的流水线式生产,设计和构建软件时能够有一种规范和工程化的方法就是软件工程

完成一个java项目需要做的工作 :

分析项目的需求、分析功能 ----->设计项目,通过哪些步骤,使用哪些技术,需要多少人,多长的时间—> 组建团队、购置设备、服务器、…… ------> 开发人员需要测试自己的代码、重复多次的工作----> 测试人员进行测试 -----> 有问题返回给开发—>重复过程直到测试代码通过

Maven工具的安装和配置

首先就是在官网下载maven,因为下载的java的版本就很新,所以这里就直接下载的最新版本,如果到时候不兼容再说,下载的网址放到这里: Maven – Download Apache Maven

第二步就是解压缩安装包了;这里将其解压到一个给中文的目录;解压之后就可以发现其约定的目录结构了;真的和tomcat有些类似,下面有bin、boot、cong、lib等文件夹 — bin目录就是程序执行的命令,最主要的就是mvn.cmd;再conf中存放的是配置文件settings;lib中iu是很多的jar文件,maven是用java编写的,所以一定要有JDK才能够正常运行

最后就是要配置环境变量: 在系统的环境中,指定一个MAVEN_HOME的名称,其值为maven的安装路径,不到bin; 之后再在系统路径中增加%MAVEN_HOME%bin 所谓的配置环境变量的目的就是为了更加方便执行程序的bin中的命令; 如果不配置只能到对应程序的bin目录下打开cmd窗口运行,配置之后就可以直接打开cmd窗口运行,从配置java、Mysql、Tomcat、Maven都是这个目的,先建立一个对应的HOME、路径为程序安装路径,bin的上一级目录; 之后再在路径中配置%?_HOME%/bin就算配置成功了

验证是否配置成功,就在cmd窗口中输入maven的命令, mvn -v

C:UsersOMEY-PC>mvn -v;
Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)
Maven home: D:Mavenapache-maven-3.8.4
Java version: 16, vendor: Oracle Corporation, runtime: D:jdk-16
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

需要注意的是,这里一定要要有JDK的路径,不然maven是无法正常执行的

Maven core POM 【program object model】项目对象模型

		        4.0.0


可以看到这个xml文件的最高级的标签就是project --- 就是将项目给抽象成了一个模型

om.xml是Maven的核心;也就是将管理的项目看作一个模型

POM是一个文件,这个文件的名称为pom.xml;maven将一个项目当作一个模型来使用,通过这个文件可以控制maven构建项目的过程,管理jar的依赖;其中更可以配置各种标签,包括项目的坐标、JDK的版本、编译的encoding

其下由很多重要的标签

基本名称:

  • modelVersion : Maven模型的版本,对于maven2和maven3来说,就是4.0.0;就是给项目设定的版本就是4.0
  • groupId : 组织ID,一般是公司域名的倒写,格式可以是域名倒写或者域名倒写+项目名 : 比如com.baidu; com.baidu.appole; per.cfeng.ICQ
  • artifactID: 项目的名称,也就是模块module的名称【最开始创建项目的时候就将一个项目看成一个module】对应的groupId下面的子项目,这也是唯一的
  • version : 项目的版本号,如果项目还在开发中,是不稳定版本,通常就在版本后带-SHAPSHOT; version使用三位数字表示; 1.1.0 ---- 代表项目迭代的版本
  • packaging : 项目打包的类型 ,可以是jar包,war包【web应用】、ear包、pom包,默认是普通的java程序jar包

依赖 : dependencies ---- 管理 和dependency — 从属,依赖, : 项目要使用的各种资源的说明,比如要使用mysql驱动

因为这个pom.xml就是项目对象模型,其中最大的标签就是project;代表就是项目

  • dependencies : 项目管理的所有的从属jar包,也就是依赖,,比如这里可以演示在pom.xml中配置一个mysql驱动 ; 以后就不需要将jar包一个一个导入到项目了,直接使用maven管理即可

    
	
        
    	mysql
    	mysql-connector-java
    	8.0.27
	

配置属性

  • properties : 这个标签用来定义一些配置属性的,比如project.build.sourceEncoding【项目的编码方式】,可以设置为UTF-8,防止中文乱码,也可以定义相关构建版本号,便于统一升级;比如Java的版本

    
    16
    16
    
     UTF-8
 

构建

  • build: 这个标签用来表示与构建相关的标签,比如设置编译插件的jdk版本,‍♂上面使用的是properties配置的

继承

  • parent : 在maven中,如果多个模块(项目)都需要声明使用相同的配置,比如groupId、artifactId、version;有相同的依赖,或者相同的组件配置,也有java类似的java继承机制,用这个标签可以声明要继承的父类工程的pom配置

聚合

  • modules : 在maven的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块的打包方式为pom,在其中使用modules聚合的其他模块,这样通过本模块就可以自动是被模块间的依赖关系构建所有的模块
约定的目录结构 【maven编写项目的常见问题】

maven项目的目录和文件的位置都是固定的,不能随意的创建— Tomcat也具有约定的目录结构,符合Servlet规范;也就是约定的目录结构就是规范,大家都是认可的 src【standard request code】标准要求代码

//比如这里创建一个工程项目Hello

Hello
|---src
|---|---main
|---|---|---java
|---|---|---resources
|---|---test
|---|---|---java
|---|---|---resources
|---pom.xml

从这个结构可以看到:工程根目录下面就是src目录和pom.xml; 在src下面有main和test目录;每个目录下面都有java和resource目录

每一个maven的项目在磁盘中就是一个文件夹(项目);下面的二级目录就是

  • src : code
    • main #防止主程序的目录 主程序的java代码和配置文件
      • java : #放置主程序包和包中的java文件
      • resources#放置主java程序使用的配置文件
    • test : # 放测试代码和文件的【可以没有】 ---- 测试在modelsim中可以看到非常常见
      • java : #放置测试程序包和包中的java文件
      • resources #放置测试java程序使用的配置文件
  • pom.xml maven的核心文件,maven项目必须有

maven执行的时候先进入pom.xml中;之后跳到main中执行主程序,再到test进行测试

使用mvn compile就可以编译项目的src下main的所有的java文件

这里可以演示一下maven管理项目的过程,这里就是使用普通的java程序

这里按照目录结构创建


4.0.0



cfeng
maventest
1.0-SNAPSHOT

上面就是maven的核心文件pom.xml的内容;这里不过多阐释【坐标就是项目的组织名,项目名称,项目的版本】

之后按照约定的目录结构来创建文件夹,创建好之后使用cmd的tree命令来查看文件的结构

PS D:Maven> tree Hello
D:MAVENHELLO
└─src
    ├─main
    │  ├─java
    │  └─resources
    └─test
        ├─java
        └─resources

这里在main的java目录中创建一个java文件

package cfeng;

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);
	}
} 

然后使用maven命令mvn compile来编译main中所有的java文件;执行后可以发现

[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------< cfeng:maventest >---------------------------
[INFO] Building maventest 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom (8.1 kB at 6.5 kB/s)
……………………………………

这里最主要就是一个下载过程,第一次编译会下载很久,Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/

  • 为什么要进行下载呢?

因为maven是用java编写的,其中就有很多功能插件,需要进行下载才能正常使用;其实就是下载了很多jar文件;这些文件都是下载到本地仓库,这个本地仓库的默认地址是{user_HOME}/.me.repository【repository 仓库】----这里可以修改本地仓库的位置

  • 从哪里下载呢?

https://repo.maven.apache.org : 中央仓库地址,所有的人都会使用这个地址

这里可能出错的地方就是忘记在pom.xml中写JDK的版本

[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project maventest: Compilation failure: Compilation failure:
[ERROR] 不再支持源选项 5。请使用 7 或更高版本。
[ERROR] 不再支持目标选项 5。请使用 7 或更高版本。
[ERROR] -> [Help 1]

这个时候就需要使用 java -version查看JDK的版本,之后再pom.xml中配置version


    
    16
    16

之后再次编译就可以成功了

D:MavenHello> mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------< cfeng:maventest >---------------------------
[INFO] Building maventest 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maventest ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maventest ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:MavenHellotargetclasses
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.276 s
[INFO] Finished at: 2022-01-03T19:32:56+08:00
[INFO] ------------------------------------------------------------------------

可以看到这就编译成功了,并且耗时很短;但是这里还有一句警告: [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent! ----- 解决的办法还是再pom.xml中加上标签


        UTF-8

这样就可以no errors,no warnings

Compiling 1 source file to D:MavenHellotargetclasses ------> 将java中的java文件编译所放的位置;也就是生成了一个target文件夹在Hello下面【结果目录】

既然已经编译生成了class文件,那么就可以在classes目录处打开cmd窗口运行代码

PS D:MavenHellotargetclasses> java cfeng.HelloMaven
10 + 20 = 30
坐标gay

gay 就是三个标签的总写,groupId,artifactId,version,项目在仓库的位置是用坐标决定的,artifactId和version指明了jar包的名称;三者一起指明了在仓库中的路径

坐标是一个唯一的字符串,用来表示资源 【 不是URI】

在上面的pom.xml中配置的基本信息中: groupId、artifactId、version 就被称为坐标,通过这个三个标签的值就就可以在互联网中唯一标识 一个项目

cfeng
maventest
1.0-SNAPSHOT
依赖管理【dependencies(管理)----> dependency(依赖从属)】

可以管理项目中可以使用的jar文件; 一个Maven项目的正常运行需要其他项目的支持,maven会根据坐标到本地仓库查找,对于programmer自己的项目要安装才能保存到仓库

不用maven的时候所有的jar都不是可用的,需要从各地进行下载;直接写上坐标,maven会自动帮助下载

 
    
        
    	mysql
    	mysql-connector-java
    	8.0.27
	


	junit
    junit
    4.11

仓库管理

资源存放的位置,就是项目构建中要完成装仓的过程

仓库 : repository是存放东西的,存放maven使用的jar(插件) 和 我们项目使用的jar(第三方驱动:mysql驱动、jackson工具)

Maven有几个重要的仓库

  • 本地仓库: 个人计算机上的文件夹,存放各种jar,就是maven下载的资源等在本机中存放的位置,这个位置默认的是C盘的.me文件下的repository中;但是C盘太小,这个地址是可以修改的,在Maven的conf文件夹下的settings.xml中就可以修改【但是修改要注意备份,因为这种修改是危险 *** 作,事先进行备份】
  

D:/Maven/repository

移动仓库后,重新编译就会再次下载资源【jar包】

  • 远程仓库:在互联网上的,使用网络才能够使用的仓库
    • 中央仓库: 最权威的,所有的开发人员都共享使用的一个集中的仓库: https://repo.maven.apache.org;所有人都会访问,压力大
    • 中央仓库的镜像mirror : 中央仓库的备份,在各大洲、重要的城市都是镜像,先到mirror中 ,找不到菜到中央仓库中寻找
    • 私服 : 在公司内部,在局域网中使用的,不对外使用

仓库的使用:

maven仓库的使用不由programmer参与, 比如开发人员需要使用mysql驱动------> maven就查找本地仓库---->私服---->中央仓库的镜像mirror---->中央仓库; 如果本地仓库没有的,下载之后都会存在于本地仓库【所以仓库会越装越多】

搜索使用的中央仓库: Maven Repository: Search/Browse/Explore (mvnrepository.com); 在这里面就可以通过groupId、artifactId作为搜索条件进行搜索、比如搜索mysql的驱动: 搜索之后就可以搜到之前使用的连接器jar包,有各种版本供选择

生命周期

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

对项目的构建是建立在生命周期的模型上的,它明确定义项目生命周期的各个截断,对于每一个阶段提供相对应的命令;对于programmer来说,无论进行哪个阶段的构建,直接执行相应的命令即可,无需担心前一阶段是否构建,Maven会自动构建

…Maven常用的命令

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

插件

执行maven构建的时候使用的工具就是插件

maven命令执行的时候,真正完成功能的就是插件,所谓的插件就是一些jar文件【一些java类】

继承和聚合

继承: 在maven中,如果多个模块(项目)都需要声明使用相同的配置,比如groupId、artifactId、version;有相同的依赖,或者相同的组件配置,也有java类似的java继承机制,用这个标签可以声明要继承的父类工程的pom配置

聚合: 在maven的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块的打包方式为pom,在其中使用modules聚合的其他模块,这样通过本模块就可以自动是被模块间的依赖关系构建所有的模块

单元测试框架Junit【测试方法】

junit就是一个专门测试的框架,测试的内容 : 测试的是类中的方法,每一个方法都是独立测试的,方法是测试的基本单位

Maven可以借助借助单元测试插件【工具】批量测试大量方法是否符合预期

使用的步骤:

  1. 在pom.xml中加入单元测试的依赖
  2. 在maven的项目中的src/test/java目录下,创建测试程序 — 推荐的创建类和方法的提示 — 测试的名称: Test + 要测试的类名; 测试的方法的名称: Test + 方法名称【比如要测试HelloMaven】
 TestHelloMaven
     @Test
     public void testAdd(){
     //测试方法是否正确
 }

//testAdd是测试方法,它的定义规则
1. 在方法上面加上@Test
2. 方法没有返回值,必须是void
3. 方法必须是public的
4. 方法命名就是test + 方法名

这里的剩下的明天会补充的

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5695290.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存