如果没有maven项目,当我们在开发不同项目的时候,都需要手动导入一些基本的、重复的JAR包,有的时候还需要考虑到版本是否正确;再比如,我们使用Spring做基本开发的时候,不使用maven项目的话,我们首先思考需要那些JAR,然后将其找到并拷入我们的项目中,最后还要将这些JAR备份到硬盘中,防止开发其他项目的时候还需要查找。
说到这里,相信大家应该可以知道我们使用Maven来做什么了,没错,我们使用Maven主要用来做Jar包管理。
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
Maven 能够帮助开发者完成以下工作:
Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,大家尽可能的遵守这样的目录结构。如下所示:
目录 | 目的 |
---|---|
${basedir} | 存放pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说property文件,springmvc.xml |
${basedir}/src/test/java | 项目的测试类,比如说Junit代码 |
${basedir}/src/test/resources | 测试用的资源 |
${basedir}/src/main/webapp/WEB-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 |
正常使用Maven有两种形式:
在这里我们直接使用集成开发工具创建即可。(手动创建项目在下文会阐述。)
我们使用IDEA创建Maven工程,为什么需要Maven工程呢?因为只有我们创建了Maven工程,Maven才能帮助我们管理Jar包以及我们的项目。
这里我们直接选择Maven的脚手架创建项目:
然后next下一步选择maven配置文件以及依赖下载的路径。
最后finish即可创建完成。
按照上述步骤创建完成之后,我们编写代码进行测试。由于我们是使用的脚手架创建的,这里没有src目录,需要我们自行创建一下。(输入src一般情况下会自动提示)
目录创建完成之后,可以自行编写一段JDBC的相关代码。(随便找个案例即可)
我们编写JDBC代码后,可以看到当前项目中没有相关Jar,导致代码报错。所以我们需要引入相关Jar,我一般会通过两种方法添加。
我们可以到中央仓库找相应的Jar:Maven中央仓库
然后搜索MySQL,选择对应的版本号即可。
选择我们需要的版本后,将对应的依赖复制进pom文件即可,同时记得刷新一下,导入相关依赖。
刷新成功后,我们可以发现项目中多出一个mysql驱动包。
这就是Maven中的Jar包管理,不需要我们到处找Jar包,它帮助我们统一管理了。
除了自己去中央仓库查找外,我们还可以通过集成开发工具的提示快速导入。
如图所示,点击Add Maven dependency,然后寻找我们需要的依赖导入即可。
选择对应依赖后,会自动加入到pom文件中。
Maven 官网
我们直接进入Maven官网下载,直接下载官网推荐的版本即可。
选择自己需要的版本:windows或者Linux。
下载完成之后,我们该如何安装呢?官网也是有具体步骤的。
首先需要确保我们的Java环境,我们去环境变量中查看有无JAVA_HOME变量。
解压我们的压缩包到任意目录中
解压完之后将maven的bin目录路径添加到环境变量中的path路径中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1MVJU5p-1645337177363)(https://gitee.com/cl1429745331/typora_imgs/raw/master/imgs/image-20220219211905442.png)]
命令行中输入mvn -v
查看是否配置完成
项目目录结构实际上指的是maven要求你的项目必须具有的一个目录层次。
这就是我们常说的约定由于配置。
我们想要使用maven进行jar包的管理以及项目的构建和管理,我们就必须遵循maven的规定/约定。
所以我们需要按照如下的目录结构来创建我们的项目。
上文我们了解了Maven的目录结构,那么我们现在就按照整体结构手动创建一下Maven项目。
首先创建一个工程文件夹 比如DemoMaven
在工程文件夹下创建src文件夹以及pom.xml文件
在src文件夹中创建main以及test文件夹
再分别到main以及test文件夹下创建Java以及resource文件夹
注意这个时候,我们是不需要手动创建target目录。
大致目录创建完成之后,我们来做一个小需求:如何在控制台输出hello world呢?
按照以往我们肯定都是写一个Java文件,在main方法中输入语句。然后在命令行中通过javac进行编译,然后执行相关文件将语句输出。那我们如何通过maven项目实现呢?
我们首先在main目录下的Java目录下创建好相关Java文件。比如我们创建一个Student类:
创建完之后我们进行如下步骤:
使用命令行进入到maven的工程中
使用mvn compile
命令进行项目的编译
这个时候相信大家都会运行失败哈哈哈
因为我们可以发现还没有对最外层的pom.xml进行操作,作为maven项目的唯一标识,他不可能啥都不干是吧?所以我们需要添加点内容。这边只需要添加不需要理解,后面会专门讲述的。
<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.0modelVersion>
<!– The Basics –>
<groupId>com.demogroupId>
<artifactId>DemoMavenartifactId>
<version>1.0version>
<packaging>warpackaging>
project>
内容添加好后我们在重新进行编译:
编译完成之后,我们可以发现自动生成了target目录,同时里面还有class文件。
既然class文件生成好了,我们是不是可以直接通过java命令来执行呢?不要急,maven会有他自己运行的方式,我们先将疑问留在这里,在后文阐述。
在maven的解压目录下我们可以发现conf目录有一个settings.xml文件,该文件是maven的全局配置文件,可以说相当重要,所以我们需要对他有个清楚的认识。
打开该文件,我们可以发现里面有很多标签,每个标签下都有对应的解释,看不明白也没事,咱们挑几个常用的说明一下:
mirrors 标签
表示配置镜像所在路径
以前手动下载jar包,我们都是从别人哪里拷贝或者网上下载,使用maven对jar包进行管理后,他会自动下载,那么他是从哪里下载的呢?没错,他就是通过该标签进行配置。
他的默认地址是国外的地址,有的时候为了加快下载速度,我们可以将地址换位国内阿里镜像地址。
只需要将以下内容复制进行mirrors标签对中即可。
<mirror>
<id>alimavenid>
<mirrorOf>centralmirrorOf>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/repositories/central/url>
mirror>
localRepository
maven下载之后的jar包到底保存在哪里呢?这就是maven仓库的概念,会在下文单独阐述。
如果我们想修改jar包保存的目录就可以通过修改该标签来实现。
interactiveMode 标识maven是否需要和用户交互以获得输入
如果maven需要和外部用户交互则设置成true否则为false。
offline
当执行编译操作的时候,是否能自动连接互联网。
pluginGroups
当插件的组织id(group id)没有显示提供时,供搜寻插件组织id的列表。
servers
仓库的下载和部署实在pom.xml文件中进行定义的。
比如说用户名、密码需要访问远程仓库的时候,有时候需要安全认证,这个认证就可以配置在servers标签中。
profiles
根据环境参数来调整构建配置的列表
Maven把jar包自动下载之后,这个保存jar包的目录由我们自己指定,我们也可以指定这个目录存储的位置,当然他也有一个默认的位置。
补充:在maven构建项目的时候,他会帮助我们把项目中所需要的一些基础的jar包下载下来,这个下载的地址就是由settings.xml文件里面的mirror标签所指定的。
还需要注意的是:如果一个jar包已经在本地仓库中有了,项目中的jar包和仓库中的jar包的版本必须一致才不需要重新下载,否则会下载对应版本的jar包。
了解到上面这些信息后,我们应该可以了解到他的优势了。没错就是节约本地的一个存储空间,不需要每个项目中都有一份jar包了。
pom全称为project object model(项目对象模型),他是我们maven项目中的唯一标识。
三个必填字段
pom文件由groupId、artifactId、version组成一个唯一标识。
groupId:公司的域名、组织等
artifactId:项目名称
version:版本号
pom里面还会有dependencies标签:这个标签就是用来配置我们项目中具体需要那些jar包。
properties标签:用来定义pom中的一些属性值。
build标签:指定如何构建当前项目
package标签:指定当前构建项目的类型:war、jar、pom
补充:pom文件是可以继承的。
dependencies标签:该标签下面可以包含多个dependence标签。
maven项目如果想要下载指定的jar包,实际上就是在pom.xml文件中的dependencies标签对中进行配置。那具体的dependence写呢?我们只需要前往中央仓库中查询我们需要的依赖将其复制过来即可。
中央仓库
在dependencies下添加相关依赖后,重新编译项目即可发现会自动将相关依赖下载到Maven本地仓库中,同时如果该Jar依赖与其他Jar,也会将依赖的jar包自动下载。(如果是集成工具引入依赖,只需要刷新即可自动导入)
Maven本质上是一个依靠插件执行的框架,所有的工作都由插件完成。它分为编译以及报告型的插件。
元素中。
元素中。因为报告插件的结果是生成网站的一部分,所以报告插件应该是国际化和本地化的。具体的插件描述我们都可以至官网查看。
那么我们该如何配置这些插件呢?我们举两个简单例子:
Archetype 是 Maven 项目的模板工具包,它定义了 Maven 项目的基本架构。Archetype 为开发人员提供了数千种创建 Maven 项目的模板,Maven 通过这些模板可以帮助用户快速的生成项目的目录结构以及 POM 文件。
Maven Archetype 由下面 5 个模块组成:
虽然官方给我们提供了很多模板,但是可能不太符合个人定制化的需要,所以为了满足自己的需求,我们可以自定义archetype。具体流程如下:(使用的是我们上文手动创建的maven项目)
在pom.xml文件添加相关插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-archetype-pulginartifactId>
<version>2.2version>
plugin>
plugins>
build>
命令行进入由pom.xml文件的根目录
执行 mvn archetype:generate
命令
在target目录下会生成一个自定义的archetype
如果想使用的话,需要通过mvn install
本地安装
如果没有私服,我们所需的所有构件都需要通过 Maven 的中央仓库或者第三方的 Maven 仓库下载到本地,而一个团队中的所有人都重复的从 Maven 仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。
另外,很多情况下项目的开发都是在内网进行的,可能根本连接不了 Maven 的中央仓库和第三方的 Maven 仓库。
我们开发的公共构件如果需要提供给其它项目使用,也需要搭建私服。
Maven 私服的概念就是在本地架设一个 Maven 仓库服务器,在代理远程仓库的同时维护本地仓库。当我们需要下载一些构件(artifact)时,如果本地仓库没有,再去私服下载,私服没有,再去中央仓库下载。这样做会有如下一些优点:
Nexus 是用来搭建 Maven 私服的,可以说是最好的免费工具了,它的官网上是这样说的:“世界上第一个也是唯一的免费使用的仓库解决方案”。目前的最新版本是 OSS 3.x。提供了针对 Windows、Unix、OS X 三种系统的版本。
官网下载太慢了,大家直接网盘下载就可以了。
链接:https://pan.baidu.com/s/14Ban-NfjLhk2Du8ElCoOgA
提取码:ns2z
前提:已经配置JDK环境变量
把压缩包解压到任意非中文目录中
根据自己的系统选择对应的版本
D:\nexus\soft\nexus-2.12.0-01\bin\jsw
运行install-nexus.bat 在系统中注册服务(或者直接运行console-nexus即可)
注册后可以通过start-nexus.bat/stop-nexus.bat 开启服务和关闭服务
也可以在系统服务中开启关闭服务
4.1 uninstall-nexus.bat 表示卸载服务
在浏览器输入 http://localhost:8081/nexus 进入主界面
在主界面右上角log in 进行登录,默认用户名和密码是
用户名:admin
密码:admin123
管理员登录后,可以在设置页面管理角色、用户等其他一系列的操作。例如创建一个角色,给角色设置某一仓库的管理权限,然后向这个角色中添加人员。具体操作不做过多介绍,一看就明白。
管理员还可以管理仓库,不过一般来说,默认的那几个仓库就可以了。默认有如下几个仓库:
proxy:这是代理方式,它是用来代理中央仓库的,例如我们依赖的包在本地仓库没有,就会到私服获取,私服没有的话,会到中央仓库先把包下载到这里,然后再下载到本地仓库;
hosted:指的是我们公司或团队内部的包,并且 hosted 类型的仓库会分为 releases 和 snapshots 两个,前者是正式版,后者一般是开发测试版;
group:它的目的就是把多个仓库组合起来,然后我们项目中只需要配置上这个类型的仓库地址,就可以把它里面组合的几个仓库都关联上。
我们也可以自己创建仓库:
创建仓库主要是配置以下我们的远程地址,从上文我们了解到如果私服没有相关JAR包需要去远程仓库获取,所以这边我们需要配置远程仓库的地址。
私服搭建完成后,我们只需要在全局配置文件中将mirror标签的地址指向我们的私服即可。
大家可以随意选择一个地址进行测试,但是需要去设置允许私服去远程仓库下载。
以上两步配置完成后,我们使用之前手动创建的Maven项目执行编译操作,查看效果。
由上图可知,我们的私服搭建完成。我们的项目首先会查看本地仓库,如果没有相关Jar则去私服查询,如果私服没有则去远程仓库下载。