一、Maven概述
1.1 项目集成jar的问题
项目中jar包资源越来越多,jar包的管理越来越沉重。常规的jar包管理主要存在以下的问题:
1.繁琐
要为每个项目手动导入所需的jar,需要搜集全部jar
2.复杂
项目中的jar如果需要版本升级,就需要再重新搜集jar
3.冗余
相同的jar在不同的项目中保存了多份
那么怎么样才能方便快捷的管理我们项目中的jar包呢?
1.2 Maven
目前开发中常用的项目管理工具主要就是:Maven和Gradle
Maven(/ˈmeɪvn/):Maven这个单词来自于意第绪语(犹太语),意为知识的积累.
Maven是一个基于项目对象模型(POM)的概念的纯java开发的开源的项目管理工具。主要用来管理java项目,进行依赖管理(jar包依赖管理)和项目构建(项目编译、打包、测试、部署)。此外还能分模块开发,提高开发效率。
Gradle([ɡredl]):是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。
官网:http://maven.apache.org/
下载链接:http://maven.apache.org/download.cgi
二、Maven安装
- 下载Maven
访问:http://maven.apache.org/download.cgi
- Maven解压
将下载的文件,选择合适的目录进行解压即可
- 环境变量
Maven需要jdk环境,所以请保证计算机配置了jdk
MAVEN_HOME = maven的安装目录
path = maven的安装目录下的bin目录
- 测试
三、Maven仓库
3.1 仓库分类
- 存储依赖的地方,体现形式就是本地的一个目录。
- 仓库中不仅存放依赖,而且管理着每个依赖的唯一标识(坐标),Java项目凭坐标获取依赖。
当需要依赖时,会从仓库中取查找,优先顺序为:
本地仓库 > 私服(如果配置了的话) > 公共仓库(如果配置了的话) > 中央仓库
3.2 本地仓库
即在settings.xml中配置的目录。
使用过了的依赖都会自动存储在本地仓库中,后续可以复用。
maven的conf目录中有 settings.xml ,是maven的配置文件,做如下配置:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- 选择一个磁盘目录,作为本地仓库 -->
<localRepository>H:\repository</localRepository>
3.3 中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,不用任何配置,maven中内置了中央仓库的地址。
其中包含了绝大多数流行的开源Java构件。
https://mvnrepository.com/ 可以搜索需要的依赖的相关信息(仓库搜索服务)
http://repo.maven.apache.org/maven2/ 中央仓库地址
3.4 公共仓库
除中央仓库之外,还有其他远程仓库。
比如aliyun仓库(http://maven.aliyun.com/nexus/content/groups/public/)
中央仓库在国外,下载依赖速度过慢,所以都会配置一个国内的公共仓库替代中央仓库
maven的conf目录中有 settings.xml 实现公共仓库配置:
<!--setting.xml中添加如下配置-->
<mirrors>
<mirror>
<id>aliyun</id>
<!-- 中心仓库的 mirror(镜像) -->
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
3.5 Maven私服
公司范围内共享的仓库,不对外开放。可以通过 Nexus来创建、管理一个私服。
nexus是一个强大的maven仓库管理器,它极大的简化了本地内部仓库的维护和外部仓库的访问.
下载地址:http://www.sonatype.org/nexus/go
四、Idea整合Maven
4.1 Idea配置Maven
在idea中关联本地安装的maven,后续就可以通过idea使用maven,管理项目
4.2 Idea创建Maven项目
4.3 Maven项目结构
- src/main/java 存放源代码,建包,放项目中代码(service,dao,User,….)
- src/main/resources 书写配置文件,项目中的配置文件(jdbc.properties)
- src/test/java 书写测试代码,项目中测试案例代码
- src/test/resources 书写测试案例相关配置文件
- 目根/pom.xml (project object model) maven项目核心文件,其中定义项目构建方式,声明依赖等
- 注意:项目中的建包,建类,执行,都和普通项目无差异
根据项目类型,在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>com.codingsir</groupId>
<artifactId>test01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包方式,如果是java项目则用 jar,
如果是web项目则用war -->
<!--<packaging>war</packaging>-->
<packaging>jar</packaging>
</project>
4.4 Maven依赖jar
建好项目后,需要导入需要的jar,要通过坐标(GAV)
- 每个构件都有自己的坐标 = groupId + artifactId + version = 项目标识 + 项目名 + 版本号
- 在maven项目中只需要配置坐标,maven便会自动加载对应依赖。删除坐标则会移除依赖
- 查找依赖
依赖查找服务:https://mvnrepository.com/ ,获得依赖的坐标,在maven项目的pom.xml中导入
2.导入依赖
在项目的pom.xml文件中,增加依赖
3.同步依赖
引入坐标后,同步依赖,确认导入:
4.5 创建Web项目
pom.xml中设置
导入JSP和Servlet和JSTL依赖,使项目具有web编译环境
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<packaging>war</packaging>
<!-- 导入JSP 和 Servlet 和 JSTL 依赖 -->
<dependencies>
<dependency>
<!-- jstl 支持 -->
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<!-- servlet编译环境 -->
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<!-- jsp编译环境 -->
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
创建webapp目录
按照maven规范,新建web项目特有目录
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 这是一个空白的web.xml文件模板 -->
</web-app>
五、Maven依赖
5.1 依赖的生命周期
Jar包生效的时间段,即Jar的生命周期,项目中导入的依赖可以做生命周期的管理
标识 | 周期 |
---|---|
compile | 缺省值,适用于所有阶段(测试运行,编译,运行,打包) |
provided | 类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet-api.jar;适用于(测试运行,编译)阶段 |
runtime | 只在运行时使用,如 mysql的驱动jar,适用于(运行,测试运行)阶段 |
test | 只在测试时使用,适用于(编译,测试运行)阶段,如 junit.jar |
system | Maven不会在仓库中查找对应依赖,在本地磁盘目录中查找;适用于(编译,测试运行,运行)阶段 |
5.2 依赖冲突
六、Maven指令
6.1 Maven指令
6.2 Maven面板
6.3 Maven各个指令
1.compile 编译
2.clean 删除target/
3.test 运行测试test case junit/testNG
4.package 打包
5.install 把项目install到local repo
6.deploy 发本地jar发布到remote
七、Maven私服
7.1 Maven私服
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。
- 有了私服之后,当 Maven 需要下载依赖时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。
- 私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载,且每次下载完只能被自己使用,不能被其他开发人员使用
- 所谓私服就是一个服务器,但是不是本地层面的,是公司层面的,公司中所有的开发人员都在使用同一个私服7.2 Maven企业级架构
我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。这里我们使用Sonatype Nexus
7.3 Nexus私服搭建
下载
官网:https://blog.sonatype.com/
下载地址:https://help.sonatype.com/repomanager2/download/download-archives—-repository-manager-oss
- 安装
下载nexus-2.x-bundle.zip,解压即可
- 启动
解压后在bin目录中执行:
- nexus install 在系统中安装nexus服务
- nexus uninstall 卸载nexus服务
- nexus start 启动服务
- nexus stop 停止服务
- 登录
访问私服:http://localhost:8081/nexus/
7.4 Nexus的仓库列表
仓库类型 | 描述 |
---|---|
group | 包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件 |
hosted | 私服 服务器本地的仓库,其中存储诸多构件 |
proxy | 代理仓库,其会关联一个远程仓库, 比如中央仓库,aliyun仓库,向该仓库查找构件时,如果没有会从其关联的仓库中下载 |
仓库名 | 描述 |
---|---|
Releases | 存放项目的稳定发布版本,一个模块做完后如果需要共享给他人,可以上传到私服的该库 |
Snapshots | 对应不稳定的发布版本 |
3rd party | 存放中央仓库没有的 ,如ojdbc.jar,可以上传到私服的该库中 |
7.5 Maven配置私服
在maven中配置私服,使得maven可以从私服上获取构件
而此时就有问题,私服中有很多仓库,每个仓库都有自己的url,则项目中配置哪个仓库呢.
私服中有一个仓库组,组中包含多个仓库,可以指定仓库组的url,即可从多个仓库中获取构件
配置settings.xml,设置私服地址、认证等信息
<servers>
<server>
<id>nexus-public</id> <!-- nexus的认证id -->
<username>admin</username> <!--nexus中的用户名密码-->
<password>admin123</password>
</server>
</servers>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus-public</id> <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
<!--name随便-->
<name>Nexus Release Snapshot Repository</name>
<!--地址是nexus中仓库组对应的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories> <!--插件仓库地址,各节点的含义和上面是一样的-->
<pluginRepository>
<id>nexus-public</id> <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
<!--地址是nexus中仓库组对应的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>yourjdk</activeProfile>
<!-- 使私服配置生效 -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
7.6 Maven项目部署到私服
执行 :mvn deploy 即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar
- 但需要提前在项目的pom.xml中配置部署私服仓库位置,如下:...
<dependencies>
.....
</dependencies>
<!-- 在项目的pom.xml中 配置私服的仓库地址,可以将项目打jar包部署到私服 -->
<distributionManagement>
<repository>
<id>nexus-public</id> <!-- nexus认证id -->
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>nexus-public</id> <!-- nexus认证id -->
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
注意:如上的 repository的 id 依然是要和settings.xml中配置的server中的id 一致,才能通过私服的认证