前言
因为现在开发的spring-boot项目都是通过maven来构建项目、管理jar包的,所以再次巩固下:
1、maven的pom.xml文件中各标签的作用;
2、maven通过在pom.xml的什么标签配置构建项目;
3、maven的setting.xml文件中各标签的含义;
4、简单回顾本地仓库、远程仓库,私服搭建。(配置私服)
一、定义
1.1 什么是maven
绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。
一个更正式的 Apache Maven1 的定义:Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
1.2与Ant区别
Ant:
a. Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码,哪里放置输出。随着时间的推移,非正式的约定出现了,但是它们还没有在产品中模式化。
b. Ant 是程序化的,你必须明确的告诉 Ant 做什么,什么时候做。你必须告诉它去编译,然后复制,然后压缩。
c. Ant 没有生命周期,你必须定义目标和目标之间的依赖。你必须手工为每个目标附上一个任务序列。
Maven:
a. Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字节码放到 target/classes ,然后在 target 生成一个 JAR 文件。
b. Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。
c. Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
1.3深入理解
Maven通常被认为是一个构建工具,与Ant类似。不过,Maven的创建者们可不这么认为,在Maven的哲学里,Maven是通过采用各种模式来创建的一个具有可视性、复用性、可维护性和完整性等特征的基础设施。
这么说有点太高大上了,接地气一点来说吧:Maven希望把软件开发中的一些最佳实践和模式都整合和固化下来,这样使用Maven来进行开发时,开发过程更爽,生产出来的软件更棒,具有以上所罗列的各种特性。
这几种特性对于一个团队一起高效的开发协作的确是非常重要的。Maven最初的诞生就是希望Apache的一些项目能够以相同的方式来开发和构建,这样一个开发者从一个项目转到另外一个项目工作的时候能够更加轻松地切换。因为项目的开发、测试、文档生成、报表和部署,都具有一些共同的特征,这些特征就可以认为是软件开发过程中的一些最佳实践,当这些最佳实践成为共识,开发的协作必然会更加高效。
那么Maven要做的就是把这些最佳实践固化成一个通用的项目管理方法。尽管对于不同的项目,开发中各个阶段会有所不同,但是确实可以找到一条普遍适用的路径,Maven将这条路径以非常清晰的方式结合各种实践模式提供给开发者。
至于模式,学术上一般简单定义为针对一种类型的特性问题的解决方案。小到一个项目的目录模式(比如:代码放到哪?测试代码放到哪?资源放到哪?),再大粒度一些比如项目的依赖如何管理,再大到整个项目构建的生命周期模式(比如:通用的构建过程包含哪些阶段?),都是Maven这个基础设施要提供给大家的,是Maven强制大家形成共同的认知。这样大家就能更快速地生产出棒棒哒的软件。
以上,便是Maven的哲学,学习过软件工程的人可能会比较有感觉。
二、仓库
2.1什么是仓库
Maven中的仓库用来存放生成的构建和各种依赖。包含两种仓库:本地仓库和远程仓库。
本地仓库指本机的一份拷贝,用来缓存远程下载、包含你尚未发布的临时构件。
远程仓库指通过各种协议如file://和http://访问的其它类型的仓库。maven私服也属于远程仓库。
本地和远程仓库有着相同的结构,所以脚本可以很容易地在两边运行,或同步仓库供离线使用。
搭建私服: nexus-2.11.1-01-bundle 运行console-nexus.bat 然后在浏览器中输入http://localhost:8081/nexus/ 用户名:admin 密码:admin123
本地仓库默认地址:C:UsersAdministrator.m2
正常情况下:C:UsersAdministrator.m2 目录下是没有settings.xml 解决方案: 1. 去maven解压目录下找conf 找到settings.xml复制到 C:UsersAdministrator.m2目录下。 <localRepository>/path/to/local/repo</localRepository> 设置本地仓库地址<localRepository>F:Repository epository-spring</localRepository>
2.2深入理解
Java最大的一个优势之一应该是整个生态中无数的框架和API,我们创建实际的项目不可避免的都需要用到这些框架和API,而它们通常都是以JAR包的形式提供。 相信很多人都经历过JAR Hell的问题吧,事实上让一个项目所依赖的依赖的外部jar包保持正确的版本和最新的状态,是意见非常苦逼的事情。我们编译项目的时候,需要在classpath上存放依赖的jar包(不管直接使用Eclipse还是手动维护Ant)。而且这些外部的jar包还会有其他依赖。你一定经历过递归地一个个去下载所有这些外部依赖,并且要确保下载的版本都是正确的,当项目越来越复杂的时候,这是意见极其麻烦的事情。
Maven现在来拯救我们了,Maven可以自动帮我们做依赖管理,我们需要做的就是在pom文件里指定依赖jar包的名称、版本号,Maven会自动下载,递归地去下载依赖的进一步依赖这件事情我们也不需要管了。
参看自知乎网友:https://www.zhihu.com/question/20104186/answer/87286506
三、构建项目
3.1本地安装
1、安装(解压即可),配置环境变量,依赖jdk7及以上。
查看本地maven版本:mvn -v
2、windows10如何安装Maven
https://jingyan.baidu.com/article/046a7b3e80bc06f9c27fa9bb.html
3、win10下配置maven环境变量
https://blog.csdn.net/qq_33979657/article/details/52909241
4、maven仓库
https://mvnrepository.com/
3.2 idea集成maven构建工具
1、现在一般通过idea进行开发,本地不安装maven也行好像。。。idea自己好像集成了maven了。
2、idea下maven设置里面的userSettingsFile和localRepository作用:配置本地仓库,可以勾选override进行修改。
3.2、构建项目
一个简单的小示例,用来说明maven构建项目的作用。
a. 通过命令创建maven项目
ps:旧版本的maven是通过”mvn archetype:create”命令,来创建项目。
1. 先在指定的盘符下建立对应的空文件夹
F:/ helloworld文件夹
命令:
mvn archetype:generate -DgroupId=com.bjsxt -DartifactId=helloworld -DpackageName=com.bjsxt
archetype:generate表示创建一个maven项目,早期版本的maven使用archetype:create
-DgroupId、-DartifactId是maven的常用坐标。用于标识maven项目的唯一性。常用的maven坐标还有:version、scope等。
-DpackageName:是用于指定java程序的包名。
b.编译、打包
切换至helloworld目录 其实就是切换到项目目录下。
mvn package命令会自动的将程序进行编译并打包。
c.运行
实际开发过程中,不会使用命令来创建maven项目。
d.Maven项目可以导入eclipse中
pom.xml 是maven项目的核心配置文件
Maven项目最主要的点:只有两个,一个是src源文件,另一个就是pom.xml。
Pom.xml是核心!
3.2 深入理解
Maven这个基础设施落地下来,最重要的还是一个构建工具(虽然Maven创建者们不屑和Ant这样的构建工具相提并论)。所以介绍Maven,必然还是需要先了解构建。
构建是什么呢?简单地说,构建就是软件项目生产的整个过程,比如这个过程应该包括:
- 文档和代码的生成(有些项目会使用代码自动生成工具,比如数据库访问代码的逆向工程)
- 代码的编译、测试和打包
- 打包好的代码进行分发或者部署
大家看看,项目的构建可绝不仅仅是编译软件这件事情。除了写代码,在项目层面做的大部分工作,都包含在构建的过程中。有了Maven,构建中的这些过程都能够进行良好的定义(模式、固化、共识,记住这些关键词哪),而且Maven能够帮我们串起来形成一个自动构建过程,这样比我们手动执行要高效得多。
四、配置文件说明
参看链接:https://blog.csdn.net/qq877507054/article/details/79138294
4.1、pom.xml文件
参看链接:https://www.cnblogs.com/szrs/p/15183120.html
4.2、settings.xml文件
用来设置Maven参数的配置文件。并且,settings.xml是Maven的全局配置文件。settings.xml中包含类似本地仓库、远程仓库和联网使用的代理信息等配置。
相对于多用户的PC机而言,在Maven安装目录的conf子目录下面的settings.xml才是真正的全局的配置。而用户目录的.m2子目录下面的settings.xml的配置只是针对当前用户的。当这两个文件同时存在的时候,那么对于相同的配置信息用户目录下面的settings.xml中定义的会覆盖Maven安装目录下面的settings.xml中的定义。用户目录下的settings.xml文件一般是不存在的,但是Maven允许我们在这里定义我们自己的settings.xml,如果需要在这里定义我们自己的settings.xml的时候就可以把Maven安装目录下面的settings.xml文件拷贝到用户目录的.m2目录下,然后改成自己想要的样子。
一般情况下,只需要如下两个就够了:
<localRepository>E:configmaven epository-spring</localRepository> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
但是在实际开发中,一般都配有自己的私服,所以会加上私服的用户名称及密码
<offline>true</offline> <server> <id>nexus-releases</id> <username>admin</username> <password>xxx</password> </server> <server> <id>nexus-snapshots</id> <username>admin</username> <password>xxx</password> </server>
参看链接:
https://www.cnblogs.com/hongmoshui/p/10762272.html
https://www.cnblogs.com/szrs/p/15251037.html
4.2.1zbj项目的settings.xml配置文件
就是当初培训用的配置文件。没有在这里进行什么特殊的配置。
4.2.2监控项目的settings.xml配置文件
4.3、两者的关系
没啥关系吧,pom.xml文件针对于具体的项目,settings.xml文件作为maven的全局配置文件;满足条件时,会采用settings.xml文件中的配置,如settingsxml文件中的Profiles标签。还有一些比较私密的配置可以写在settings.xml文件中。
参看链接:
https://www.cnblogs.com/xrq730/p/5530069.html
https://blog.csdn.net/qq877507054/article/details/79138294