因为 Java 的生态很是丰富,不管你想实现什么功能,都能找到对应的工具类,这些工具类都是以 jar 包的形式出现的,例如 Spring,SpringMVC、MyBatis、数据库驱动,等等,都是以 jar 包的形式出现的,jar 包之间会有关联,在使用一个依赖以前,还须要肯定这个依赖所依赖的其余依赖,因此,当项目比较大的时候,依赖管理会变得很是麻烦臃肿,这是 Maven 解决的第一个问题。java
Maven 还能够处理多模块项目。简单的项目,单模块分包处理便可,若是项目比较复杂,要作成多模块项目,例如一个电商项目有订单模块、会员模块、商品模块、支付模块...,通常来讲,多模块项目,每个模块没法独立运行,要多个模块合在一块儿,项目才能够运行,这个时候,借助 Maven 工具,能够实现项目的一键打包。web
Maven 以前,咱们更多的是使用 Ant 的项目构建工具,Ant 有一个特色,每次都得写,每次都写的差很少,配置也臃肿。因此,后来搞出来 Maven。Maven 就是最早进的版本构建工具吗?不是的,只不过,目前在 Java 领域 Maven 使用比较多。除了 Maven,还有 Gradle。spring
Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反映在配置中,就是一个 pom.xml 文件。是一组标准集合,一个项目的生命周期、一个依赖管理系统,另外还包括定义在项目生命周期阶段的插件(plugin)以及目标(goal)。数据库
当咱们使用 Maven 的使用,经过一个自定义的项目对象模型,pom.xml 来详细描述咱们本身的项目。apache
Maven 中的有两大核心:浏览器
下载 Maven:bash
下载地址:maven.apache.org/download.cg…微信
配置,只须要配置环境变量便可:app
首先配置 MAVEN_HOME:webapp
而后配置环境变量:
若是使用了 IntelliJ IDEA ,能够不用去额外下载 Maven,直接使用 IDEA 中自带的 Maven 插件便可。IntelliJ IDEA 中自带的 Maven 插件在
\ideaIU-2019.2.4.win\plugins\maven\lib\maven3
实际上,没有特殊需求的话,安装好以后直接就能够用了。通常来讲,仍是须要稍微配置一下,好比中央仓库的问题。默认使用 Maven 本身的中央仓库,使用起来网速比较慢,这个时候,能够经过修改配置文件,将仓库改为国内的镜像仓库,国内仓库使用较多的是阿里巴巴的仓库。
仓库类型 | 说明 |
---|---|
本地仓库 | 就是你本身电脑上的仓库,每一个人电脑上都有一个仓库,默认位置在 当前用户名\.m2\repository |
私服仓库 | 通常来讲是公司内部搭建的 Maven 私服,处于局域网中,访问速度较快,这个仓库中存放的 jar 通常就是公司内部本身开发的 jar |
中央仓库 | 有 Apache 团队来维护,包含了大部分的 jar,早期不包含 Oracle 数据库驱动,从 2019 年 8 月开始,包含了 Oracle 驱动 |
如今存在 3 个仓库,那么 jar 包如何查找呢?
本地仓库默认位置在 当前用户名\.m2\repository
,这个位置能够自定义,可是不建议你们自定义这个地址,有几个缘由:
技术上来讲,固然是能够自定义本地仓库位置的,在 conf/settings.xml 中自定义本地仓库位置:
因为默认的中央仓库下载较慢,所以,也能够将远程仓库地址改成阿里巴巴的仓库地址:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
复制代码
这段配置,加在 settings.xml 中的 mirrors 节点中:
Maven 中有一些常见的命令,若是使用 Eclipse 须要手动敲命令,若是使用 IDEA 的话,能够不用命令,直接点点点就能够了。
经常使用命令 | 中文含义 | 说明 |
---|---|---|
mvn clean | 清理 | 这个命令能够用来清理已经编译好的文件 |
mvn compile | 编译 | 将 Java 代码编译成 Class 文件 |
mvn test | 测试 | 项目测试 |
mvn package | 打包 | 根据用户的配置,将项目打成 jar 包或者 war 包 |
mvn install | 安装 | 手动向本地仓库安装一个 jar |
mvn deploy | 上传 | 将 jar 上传到私服 |
这里须要注意的是,这些命令都不是独立运行的,它有一个顺序。举个简单例子:
我想将 jar 上传到私服,那么就要构建 jar,就须要执行 package 命令,要打包,固然也须要测试,那就要走 mvn test 命令,要测试就要先编译.....,所以,最终全部的命令都会执行一遍。不过,开发者也能够手动配置不执行某一个命令,这就是跳过。通常来是,除了测试,其余步骤都不建议跳过。
固然,若是开发者使用了 IDEA ,这些命令不用手动敲,点一下就行:
能够直接经过命令来构建一个 Maven 项目,不过在实际开发中,通常使用 Eclipse 或者 IDEA 就能够直接建立 Maven 项目了。
建立命令:
mvn archetype:generate -DgroupId=org.javaboy -DartifactId=firstapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
复制代码
看到以下提示,表示项目建立成功:
项目建立成功后,就两个文件:
说明对一个任何一个项目而言,最最核心的就是这两个。
pom.xml 中,则定义了全部的项目配置。
接下来,咱们经过 mvn package 命令能够将刚刚建立的项目打成一个 jar 包。
在打包以前,须要配置 JDK 的版本至少为 7 以上,所以,咱们还须要手动修改一下 pom.xml 文件,即添加以下配置:
添加完成后,执行打包命令,注意执行全部命令时,命令行要定位到 pom.xml 文件所在的目录,看到以下提示,表示项目打包成功。
若是须要将项目安装到本地仓库,能够直接执行 mvn install 命令,注意,mvn install 命令会包含上面的 mvn package 过程。
安装到本地仓库以后,这个时候,点开本身的本地仓库,就能够看到相关的 jar 了。
不一样于 Eclipse,IDEA 安装完成后,就能够直接使用 Maven 了。
IDEA 中,Maven 的配置在 File->Settings->Build,Execution,Deployment->Build Tools->Maven
:
首先在建立一个工程时,选择 Maven 工程:
若是勾选上 Create from archetype ,则表示能够根据一个项目骨架(项目模板)来建立一个新的工程,不过,若是只是建立 JavaSE 项目,则不用选择项目骨架。直接 Next 便可。而后填入项目的坐标,即 groupId 和 artifactId。
填完以后,直接 Next 便可。这样,咱们就会获取一个 JavaSE 工程,项目结构和你用命令建立出来的项目如出一辙。
在 IDEA 中,建立 Maven Web 项目,有两种思路:
两种方式中,推荐使用第一种方式。
这种方式,首先建立一个 JavaSE 项目,建立步骤和上面的一致。
项目建立完成后,首先修改 pom.xml ,配置项目的打包格式为 war 包。 这样,IDEA 就知道当前项目是一个 Web 项目:
而后,选中 JavaSE 工程,右键单击,选择 Open Module Settings,或者直接按 F4,而后选择 Web,以下图:
接下来,在 webapp 目录中,添加 web.xml 文件。
注意,必定要修改 web.xml 文件位置:
配置完成后,点击 OK 退出。
项目建立完成后,接下来就是部署了。
部署,首先点击 IDEA 右上角的 Edit Configurations:
而后,配置 Tomcat:
接下来选择 Deployment 选项卡,配置要发布的项目:
最后,点击 IDEA 右上角的三角符号,启动项目。
这种方式比较简单,基本上不须要额外的配置,项目建立完成后,就是一个 web 项目。只须要咱们在建立项目时,选择 webapp 骨架便可。
选择骨架以后,后面的步骤和前文一致。
项目建立成功后,只有 webapp 目录,这个时候,本身手动建立 java 和 resources 目录,建立完成后,右键单击,选择 Mark Directory As,将 java 目录标记为 sources root,将 resources 目录标记为 resources root 便可。
凡是在 IDEA 右下角看到了 Enable Auto Import 按钮,必定点一下
Maven 项目,若是须要使用第三方的控件,都是经过依赖管理来完成的。这里用到的一个东西就是 pom.xml 文件,概念叫作项目对象模型(POM,Project Object Model),咱们在 pom.xml 中定义了 Maven 项目的形式,因此,pom.xml 至关因而 Maven 项目的一个地图。就相似于 web.xml 文件用来描述三大 web 组件同样。
这个地图中都涉及到哪些东西呢?
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
复制代码
在 dependencies 标签中,添加项目须要的 jar 所对应的 maven 坐标。
一个 dependency 标签表示一个坐标
团体、公司、组织机构等等的惟一标识。团体标识的约定是它以建立这个项目的组织名称的逆向域名(例如 org.javaboy)开头。一个 Maven 坐标必需要包含 groupId。一些典型的 groupId 如 apache 的 groupId 是 org.apache.
artifactId 至关于在一个组织中项目的惟一标识符。
一个项目的版本。一个项目的话,可能会有多个版本。若是是正在开发的项目,咱们能够给版本号加上一个 SNAPSHOT,表示这是一个快照版(新建项目的默认版本号就是快照版)
表示依赖范围。
咱们添加了不少依赖,可是不一样依赖的使用范围是不同的。最典型的有两个,一个是数据库驱动,另外一个是单元测试。
数据库驱动,在使用的过程当中,咱们本身写代码,写的是 JDBC 代码,只有在项目运行时,才须要执行 MySQL 驱动中的代码。因此,MySQL 驱动这个依赖在添加到项目中以后,能够设置它的 scope 为 runtime,编译的时候不生效。
单元测试,只在测试的时候生效,因此能够设置它的 scope 为 test,这样,当项目打包发布时,单元测试的依赖就不会跟着发布。
在图中,a.jar 依赖 b.jar,同时 a.jar 依赖 d.jar,这个时候,a 和 b、d 的关系是直接依赖的关系,a 和 c 的关系是间接依赖的关系。
以 spring-context 为例,下图中 x 表示失效的依赖(优先级低的依赖,即路径近的依赖优先使用):
上面这两条是默认行为。
咱们也能够手动控制。手动控制主要是经过排除依赖来实现,以下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
复制代码
这个表示从 spring-context 中排除 spring-core 依赖。
Maven 仓库管理也叫 Maven 私服或者代理仓库。使用 Maven 私服有两个目的:
Nexus 是一个强大的 Maven 仓库管理工具,使用 Nexus 能够方便的管理内部仓库同时简化外部仓库的访问。官网是:www.sonatype.com/
下载地址:www.sonatype.com/download-os…
将下载下来的压缩包,拷贝到一个没有中文的路径下,而后解压。
解压以后,打开 cmd 窗口(以管理员身份打开 cmd 窗口),而后定位了 nexus 解压目录,执行 nexus.exe/run 命令启动服务。
这个启动稍微有点慢,大概有 1 两分钟的样子
启动成功后,浏览器输入 http://lcoalhost:8081 打开管理页面。
打开管理页面后,点击右上角上的登陆按钮进行登陆,默认的用户名/密码是 admin/admin123。固然,用户也能够点击设置按钮,手动配置其余用户。
点击 Repositories 能够查看仓库详细信息:
名称 | 说明 |
---|---|
proxy | 表示这个仓库是一个远程仓库的代理,最典型的就是代理 Maven 中央仓库 |
hosted | 宿主仓库,公司本身开发的一些 jar 存放在宿主仓库中,以及一些在 Maven 中央仓库上没有的 jar |
group | 仓库组,包含代理仓库和宿主仓库 |
virtual | 虚拟仓库 |
上传 jar,配置两个地方:
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
复制代码
在要上传 jar 的项目的 pom.xml 文件中,配置上传路径:
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
复制代码
配置完成后,点击 deploy 按钮,或者执行 mvn deploy 命令就能够将 jar 上传到私服上。
直接在项目中添加依赖,添加完成后,额外增长私服地址便可:
<repositories>
<repository>
<id>local-repository</id>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
复制代码
所谓的聚合工程,实际上也就是多模块项目。在一个比较大的互联网项目中,项目须要拆分红多个模块进行开发,好比订单模块、VIP 模块、支付模块、内容管理模块、CMS、CRM 等等。这种拆分方式,实际上更接近于微服务的思想。在一个模块中,还能够继续进行拆分,例如分红 dao、service、controller 等。
有人可能会说,这个分包不就好了吗?
小项目固然能够分包,大项目就无法分包了。好比,在一个大的电商系统中,有一个子模块叫作用户管理、还有一个子模块叫作订单管理,这两个子模块都涉及到用户,像这种状况,咱们就须要将用户类单独提取出来,作成单独的模块,供其余模块调用。
|--javaboy-parent
|-- javaboy-cms
|-- javaboy-crm
|-- javaboy-manger
|-- javaboy-manager-model
|-- javaboy-manager-dao
|-- javaboy-manager-service
|-- javaboy-manager-web
复制代码
以 javaboy-manger 为例,javaboy-manager 自己并不提供功能,它只负责管理他本身的子模块,而他的子模块每个都没法独立运行,须要四个结合在一块儿,才能够运行。项目打包时,model、dao、service 都将打包成 jar,而后会自动将打包好的 jar 复制到 web 中,再自动将 web 打包成 war 包。
1.建立一个空的 Maven 项目:
项目建立完成后,因为 parent 并不参与业务的实现,只是用来管理它的子模块,所以,src 目录能够将其删除。
2.选中当前工程,右键单击,New->Module
在 IDEA 中,已经默认指明了当前 Module 的 parent,开发者只须要填入当前 Module 的 artifactId 便可:
javaboy-manager 建立完成后,此时,观察 javaboy-parent 的 pom.xml 文件,发现它自动加上了 packing 属性:
其中,它的 packaging 属性值为 pom,这表示它是一个聚合工程,同时,他还多了 modules 节点,指明了它本身的子模块。 同时,注意 javaboy-manager ,它自身多了一个 parent 节点,这个 parent 节点描述了它的父模块的属性值:
<parent>
<artifactId>javaboy-parent</artifactId>
<groupId>org.javaboy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
复制代码
这个 parent 不只仅是一个简单的父子关系描述,它存在继承关系,通常咱们能够在 parent 中统必定义依赖或者插件的版本号
3.因为 javaboy-manager 自己也是一个聚合工程,所以,javaboy-manager 的 src 目录也能够删除。
4.选中 javaboy-manager,右键单击,New->Module 建立一个新的 Maven 模块出来。这个步骤相似于第二步,不在赘述。 这里,新的 javaboy-manager-model 建立成功后,咱们手动配置它的 packaging 属性值为 jar。
5.依照第 4 步,再分别建立 javaboy-manager-service 以及 javaboy-manager-dao 6.继续建立 javaboy-manager-web 模块,不一样于其余模块,web 模块须要打包成 war。web 模块建立能够参考【第五篇文章】。 7.web 工程建立完成后,完善模块之间的继承关系。
javaboy-manager-web 依赖 javaboy-manager-service javaboy-manager-service 依赖 javaboy-manager-dao javaboy-manager-dao 依赖 javaboy-manager-model
注意,依赖默认是有传递性的,即在 javaboy-manager-dao 中依赖了 javaboy-manager-model,在 javaboy-manager-service 也能访问到。
配置后的依赖关系以下图:
接下来就能够在不一样的模块中写代码,而后进行项目部署了。部署方式参考【第五篇文章】
有一个须要注意的地方,在多模块项目中,web 项目打包须要注意如下问题: