Maven初步学习之 Why & What

参考教程 :
跟着刚哥深入学maven(通俗易懂)
Maven学习总结
Maven通俗讲解

1.1 why we need this?

第一次听到Maven的时候,自然就去查了下,结果大都就是说管理依赖blahblah的,其实作为学生,所接触过的项目也就仅限于几百行代码的小工具啊,我又不是大公司,自己怎么写出来一个还需要外部jar包依赖之类的大项目,所以也就一直对这个项目依赖管理这方面不是很care。

直到后来自己写的代码也多了一些,确实管理起来也有点混乱,再来接触到maven这个东西,就理解了这个东西存在的价值。

[一个简单的问题]

在进行讲解前,先提问一个简单的问题。

假如你正在Eclipse下开发两个Java项目,姑且把它们称为A、B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢?

在使用Maven前是这样做的,将B项目打包为jar,并在A项目的Library下导入B的jar文件。

这样做有着很明显的缺点:

  1. 如果在开发过程中,发现B中的bug,则必须重新将B打包并对A项目进行重编译操作
  2. 在协同开发A项目时,为了保证其能够正常运行,要么选择将B打包入A中,要么选择将B一样发布出去并告知开发者使用方法。
  3. 显然这两个方法都不太好,前者可能造成资源浪费(比如开发者可能正在开发依赖B的其它项目,B已经存储到本地了),而后者则会为项目正常运行带来风险(一旦把工作交给人工注定会带来一定的失败率)。显然这两个方法都不太好,前者可能造成资源浪费(比如开发者可能正在开发依赖B的其它项目,B已经存储到本地了),而后者则会为项目正常运行带来风险(一旦把工作交给人工注定会带来一定的失败率)。
    因此,这样手动的控制项目间依赖关系显然是一种‘拙劣’的方法。
① 一个项目就是一个工程

如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利于分工协作。

借助于maven就可以将一个项目拆分成多个工程

② 项目中使用jar包,需要“复制”、“粘贴”项目的lib中

同样的jar包重复的出现在不同的项目工程中,你需要做不停的复制粘贴的重复工作。

借助于maven,可以将jar包保存在“仓库”中,不管在哪个项目只要使用引用即可就行。

③ jar包需要的时候每次都要自己准备好或到官网下载

借助于maven我们可以使用统一的规范方式下载jar包,规范

④ jar包版本不一致的风险

不同的项目在使用jar包的时候,有可能会导致各个项目的jar包版本不一致,导致未执行错误。

借助于maven,所有的jar包都放在“仓库”中,所有的项目都使用仓库的一份jar包。

⑤ 一个jar包依赖其他的jar包需要自己手动的加入到项目中

极大的浪费了我们导入包的时间成本,也极大的增加了学习成本。

借助于maven,它会自动的将依赖的jar包导入进来。

所以
  • 帮你以正确的方式,下载正确的jar包;
  • 帮你寻找依赖,下载依赖
  • 热部署,热编译

1.2 安装和测试

这部分就不多讲了。

参考教程 Maven学习总结(一)——Maven入门

这里有个关于修改从Maven中心仓库下载到本地的jar包的默认存储位置,

从Maven中心仓库下载到本地的jar包的默认存放在” u s e r . h o m e / . m 2 / r e p o s i t o r y ” 中 , {user.home}/.m2/repository”中, user.home/.m2/repository{user.home}表示当前登录系统的用户目录(如"C:\Users\xiaozhou")。

.m2应该是Windows下的隐藏目录,没找到的同学先打开自己的隐藏目录

Jar包存放在这个位置不太好,我们希望能够自己定义下载下来的jar包的存放位置,因此我们可以自己设置下载到本地时的jar包的存放目录。
找到apache-maven-3.2.3\conf目录下的settings.xml文件,加上一句代码:

 <localRepository>E:/repository</localRepository>

如下图所示:
在这里插入图片描述

1.3 what is maven?

maven是一款服务于java平台的自动化构建工具

make->Ant->Maven->Gradle

1.3.1 目录组成

在这里插入图片描述

Maven的核心功能便是合理叙述项目间的依赖关系
所有的Maven项目包含着一个名为pom.xml的文件,在文件中记录着自己的<groupId><artifactId><version>等字段,这些字段在创建Maven项目时填写,Maven会依据它们来定位到该项目。
在pom中的另一个关键标签是<dependencies>,该标签下可以包含若干个<dependency>标签,而<dependency>下则是上面介绍的<groupId><artifactId><version>等依赖字段。

它们确定着一个唯一的项目版本。

注:执行maven命令必须进入到pom.xml的目录中进行执行,即maven project的根目录。
1.3.2 一个典型的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
 
	<groupId>org.keplerproject</groupId>
	<artifactId>luajava</artifactId>
	<version>1.1</version>
	<packaging>jar</packaging>
 
	<name>luajava</name>
	<url>http://maven.apache.org</url>
 
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.0.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

pom.xml文件的节点元素说明:

<project>pom文件的顶级节点
<modelVersion>object model版本,对Maven2和Maven3来说,只能是4.0.0
<groupId>项目创建组织的标识符,一般是域名的倒写
<artifactId>定义了项目在所属组织的标识符下的唯一标识,一个组织下可以有多个项目
<version>当前项目的版本,SNAPSHOT,表示是快照版本,在开发中
<packaging>打包的方式,有jar、war、ear等
<name>项目的名称
<url>项目的地址
<properties>属性配置,比如:<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<dependencies>构建项目依赖的jar

1.4 仓库和坐标

仓库的分类:
1、本地仓库:当前电脑上的仓库,上面修改的仓库就是本地仓库;
2、远程仓库:
(1)私服:搭建在局域网中,一般公司都会有私服,私服一般使用nexus来搭建。具体搭建过程可以查询其他资料;
(2)中央仓库:架设在Internet上,像刚才的springframework就是在中央仓库上。

解析依赖时,先在本地仓库中查找被依赖的jar包,再去中央仓库,若都无,则编译失败。

在这里插入图片描述

maven坐标和仓库对应的映射关系:[groupId ]\ [artifactId] \ [version] \ [artifactId]-[version].jar

去本地仓库看一下此目录:org\springframework\spring-core\4.3.4.RELEASE\spring-core-4.3.4.RELEASE.jar
果然是完全对应的(默认仓库地址上面说过了)

依赖范围

上面除了定位jar包的三个坐标以外,还有一个<scope>,就是字面的意思,此依赖所作用的范围(环节),默认是compile(下面会讲到maven的各个环节),当然可以选择其他:

1、compile默认值,适用于所有阶段(开发、测试、部署、运行),本jar会一直存在所有阶段。
2、provided只在开发、测试阶段使用,目的是不让Servlet容器和你本地仓库的jar包冲突 。如servlet.jar。
3、runtime只在运行时使用,如JDBC驱动,适用运行和测试阶段。
4、test只在测试时使用,用于编译和运行测试代码。不会随项目发布。
5、system类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

1.5 各个环节

[1] 清理clean将以前编译得到的旧文件class字节码文件删除
[2] 编译compile将java源程序编译成class字节码文件
[3] 测试test自动测试,自动调用junit程序
[4] 报告report测试程序执行的结果
[5] 打包package动态Web工程打War包,java工程打jar包
[6] 安装installMaven特定的概念-----将打包得到的文件复制到“仓库”中的指定位置
[7] 部署deploy将动态Web工程生成的war包复制到Servlet容器下,使其可以运行

关于各个环节的练习也可以看这个参考教程 Maven学习总结(一)——Maven入门

1.6 生命周期

Maven有三套相互独立的生命周期
  1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。Clean生命周期一共包含了三个阶段:
    1、pre-clean 执行一些需要在clean之前完成的工作
    2、clean 移除所有上一次构建生成的文件
    3、post-clean 执行一些需要在clean之后立刻完成的工作

  2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
    1、validate
    2、generate-sources
    3、process-sources
    4、generate-resources
    5、process-resources 复制并处理资源文件,至目标目录,准备打包
    6、compile 编译项目的源代码
    7、process-classes
    8、generate-test-sources
    9、process-test-sources
    10、generate-test-resources
    11、process-test-resources 复制并处理资源文件,至目标测试目录
    12、test-compile 编译测试源代码
    13、process-test-classes
    14、test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
    15、prepare-package
    16、package 接受编译好的代码,打包成可发布的格式,如 JAR
    17、pre-integration-test
    18、integration-test
    19、post-integration-test
    20、verify
    21、install 将包安装至本地仓库,以让其它项目依赖。
    22、deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享

  3. Site Lifecycle 生成项目报告,站点,发布站点。
    1、pre-site 执行一些需要在生成站点文档之前完成的工作
    2、site 生成项目的站点文档
    3、post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
    4、site-deploy 将生成的站点文档部署到特定的服务器上

1.x 后记

一圈下来,个人理解大概就是在pom.xml这个配置文件中,来加载本项目所需要依赖的各种唯一jar包(包-模块-版本),并且这些jar包是可以动态编译部署的,就不用每次都手动重新部署了。

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 &quot;已报废&quot; 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室&rarr;选择设备&rarr;选择时间段&rarr;提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值