目录
相关文章
Maven总结2/3-----maven工程拆分与聚合
Maven总结3/3-----私服、第三方jar包的上传和下载
1.Maven 概述
(1)概念
Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM: Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标 (goal)的逻辑。
* 依赖管理
传统工程 | maven工程 |
---|---|
直接把jar包放在在项目中 | maven通过创建仓库,保存jar包,,项目中只用放置jar包的坐标 然后通过pom.xml配置文件,来配置jar包依赖 |
pom文件jar包坐标内容:
groupId 公司或组织域名的倒序
artifactId 项目名或模块名
version 版本号
示例:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--坐标作用域,非必填-->
<scope>test</scope>
</dependency>
- 通过读取 pom.xml 文件中的坐标,再到仓库中找到 jar 包,会不会很慢?
通过 pom.xml 文件配置要引入的 jar 包的坐标,再读取坐标并到仓库中加载 jar 包,这样我们就可以直接使用 jar 包了。
为了解决这个过程中速度慢的问题,maven 中也有索引的概念,通过建立索引,可以大大提高加载 jar 包的速度,使得我们认为 jar 包基本跟放在本地的工程文件中再读取出来的速度是一样的。
这个过程就好比我们查阅字典时,为了能够加快查找到内容,书前面的目录就好比是索引,有了这个目录我们就可以方便找到内容了,一样的在 maven 仓库中有了索引我们就可以认为可以快速找到 jar 包。
* 一键构建
什么是构建?
指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个过程称为构建。
什么是一键构建构建?
一键构建指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作。
- maven项目目录下输入:mvn tomcat:run 可以启动项目。
* 仓库的种类
种类 | 作用 |
---|---|
本地仓库 | 用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找 |
远程仓库(私服) | 如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。例如:公司内部开发所需要的jar包 |
中央仓库 | 在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件安装完maven之后,本地maven自动连接中央仓库。 |
- 下载jar包:搜索maven中央仓库→搜索要下载的jar包→选择要下载的版本→复制jar包信息。
* 仓库之间的关系
类别 | 关系 |
---|---|
本地仓库与pom文件 | 当我们启动一个maven工程的时候,maven工程会通过pom文件中的jar包的坐标去本地仓库找对应的jar包(如果是编译阶段,可以直接找本地项目的源码) |
本地仓库和中央仓库仓库 | 默认情况下(或公司断网时候),如果本地仓库没有jar包,maven工程会自动(断网时通过局域网连接远程仓库)去中央仓库下载jar包到本地。 |
本地仓库和远程仓库 | 在公司中,如果本地没有对应的jar包,会先从私服下载jar包,如果私服没有jar包,可以从中央仓库下载,也可以从本地上传。 |
(2)Maven 的好处
节省磁盘空间,可以一键构建,可以跨平台,应用在大型项目时可以提高开发效率。
一键构建:maven自身集成了tomcat插件,可以对项目进行编译、测试、打包、安装、发布等操作。
maven三套生命周期:清理生命周期、默认生命周期、站点生命周期。
(3)maven安装
①为了使用 Maven 管理工具,我们首先要到官网去下载它的安装软件。
②Maven 下载后,将 Maven 解压到一个没有中文没有空格的路径下。
③maven环境变量: %MAVEN_HOME%\bin
- 通过 mvn -v命令检查 maven 是否安装成功,看到 maven 的版本为 3.5.2 及 java 版本为 1.8 即为安装成功。
- 电脑上需安装 java 环境,安装 JDK1.7 + 版本。
【解压后的文件夹目录及存放内容】
文件夹目录 | 存放内容 |
---|---|
bin | 存放了 maven 的命令,比如 mvn tomcat:run |
boot | 存放了一些 maven 本身的引导程序,如类加载器等 |
conf | 存放了 maven 的一些配置文件,如 setting.xml 文件 |
lib | 存放了 maven 本身运行所需的一些 jar 包 |
3. Maven常用命令和生命周期
(1)常用命令
命令 | 含义 |
---|---|
clean | 构建项目的时候,清理之前构建项目的信息,执行 clean 会删除 target 目录及内容。例如,在公司中维护别人之前写的代码,尤其点电脑配置、项目配置不同,部署项目方式不同,可以先清理。 |
validate | 验证项目是否正确,所有必要的信息可用 |
compile | 对src/main下的目录进行编译 |
test | 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署 |
package | 本地项目直接打包,打包在本地编译目录—target目录下。对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war包。 |
verify | 对集成测试的结果执行任何检查,以确保满足质量标准 |
install | 把项目打包(根据pom文件配置,打包成jar/war包)安装到本地仓库 |
deploy | 本地做好的项目直接打包上传到私服,与其他开发人员和项目共享 |
(2)生命周期图
maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”。
生命周期 | 作用 |
---|---|
Clean Lifecycle(清理生命周期) | 在进行真正的构建之前进行一些清理工作。 |
Default Lifecycle(默认生命周期) | 构建的核心部分,编译,测试,打包,部署等等。 |
Site Lifecycle(站点生命周期) | 生成项目报告,站点,发布站点。 |
4. maven工程目录结构
(1)目录结构
目录 | 存放内容 |
---|---|
src/main/java | 存放项目的.java 文件 |
src/main/resources | 存放项目资源文件,如 spring, hibernate 配置文件 |
src/test/java | 存放所有单元测试.java 文件,如 JUnit 测试类 |
src/test/resources | 测试资源文件 |
target | 项目输出位置,编译后的 class 文件会输出到此目录 |
pom.xml | maven 项目核心配置文件 |
(2)项目运行
①命令行运行:
进入 maven 工程目录(当前目录有 pom.xml 文件),运行 tomcat:run 命令。
②项目中运行
4. 解决冲突
maven工程要导入jar包的坐标,就必须要考虑解决jar包冲突。
maven导入jar包中的一些概念
概念 | 含义 |
---|---|
直接依赖 | 项目中直接导入的jar包,就是在该项目中的直接依赖包。 |
传递依赖 | 项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去。 |
解决冲突方式一:第一声明优先原则
概念:哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。
先声明的jar包坐标下的依赖包,可以优先进入项目中。
解决冲突方式二:路径近者优先原则。
直接依赖路径比传递依赖路径近,那么最终项目进入的jar包会是路径近的直接依赖包。
解决冲突方式三:直接排除法(推荐使用)
当我们要排除某个jar包下依赖包,在配置exclusions标签的时候,内部可以不写版本号。
因为此时依赖包使用的版本会默认和本jar包一样。
5.maven工程父子依赖
maven工程是可以分父子依赖关系:一个项目依赖另一个项目。
凡是依赖别的项目或拿到别的项目的依赖包,都属于传递依赖。
比如:当前A项目,被B项目依赖,那么我们A项目中所有jar包都会传递到B项目中,B项目开发者,如果在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖,那么直接依赖的jar包就会把我们A项目传递过去的jar包覆盖掉。
为了防止以上情况出现。我们可以把A项目中主要jar包的坐标锁住,那么其他依赖该项目的项目中,及时有同名jar包直接依赖,也无法覆盖。
<!-- 统一管理jar包版本 -->
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<!-- 锁定jar包版本:子项目不可更改 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependencies>
</dependencyManagement>
【 插件配置】