maven进阶了解
目录
- 依赖
- 什么是依赖管理?
- 依赖方式
- 项目构建
- 什么是项目构建?
- 有两种项目构建方式:
- maven
- 什么是maven?
- maven目录分析
- maven仓库
- 本地加载配置
- pom.xml文件
- maven坐标
- 生命周期
- maven继承和聚合
- 继承
- 可继承的pom元素
- 聚合
- 示例
- 私服架构
- 什么叫私服?
- Nexus
- Nexus仓库类型
- Nexus常用命令
- maven私服实战
- nexus安装
- 将项目发布到私服
- 从私服下jar包
- 第三方jar包发布到私服
依赖
什么是依赖管理?
对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。
依赖方式
依赖有两种:
- 依赖传递:C依赖B,B依赖A
- 如果C不想引入依赖A,可以进行依赖阻断,
<optional>true</optional>
- 如果C不想引入依赖A,可以进行依赖阻断,
- 可选依赖:明确排除掉某一依赖,看使用exclusion属性,排除掉引用的依赖
<exclusions><groupId>cn.tx.maven</groupId><artifactId>Hello</artifactId> </exclusions>
项目构建
什么是项目构建?
项目构建是一个从编写源代码到编译、测试、运行、打包、部署的过程。
有两种项目构建方式:
- 传统项目:打开idea编写源代码和配置文件,对源代码进行编译,可以使用junit进行单元测试,把项目打成war包,部署到tomcat服务器中运行。
- maven项目:将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。
- 清理 -> 编译 -> 测试 -> 报告 -> 打包 -> 部署
| 依赖范围(scope) | 对主代码classpath有效 | 对测试代码classpath有效 | 被打包,对运行代码classpath有效 | 例子 |
|---|---|---|---|---|
| compile | ✅ | ✅ | ✅ | log4j |
| test | - | ✅ | - | junit |
| provided | ✅ | ✅ | - | servlet-api |
| runtime | - | - | ✅ | JDBC |
maven
什么是maven?
maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
maven目录分析
- bin:含有mvn运行的脚本
- boot:含义plexus-classworlds类加载器框架
- conf:含义seeting.xml配置文件
- lib:含义maven运行时所需要的java类库
- 其它……
maven仓库
maven仓库: 用来统一存储所有maven共享构建的位置。
maven仓库布局: 根据maven坐标定义每个构建在仓库中唯一存储路径。
仓库分类:
- 本地仓库(local):每个用户只有一个本地仓库
- 远程仓库(remote):中央仓库(central,maven默认的仓库)、私服(特殊的远程仓库,是架设在局域网内的仓库)
本地加载配置
如果创建项目速度非常慢,并且在Generating project in Batch mode卡住,则进行
全局设置如下:
file -> setting -> Runner -> 在VM Options中输入:-DarchetypeCatalog=local

pom.xml文件
pom定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。
maven项目的核心是pom.xml。
maven坐标
在maven中坐标是构建的唯一标识。
坐标的意义: Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范。拥有了统一规范,就可以把查找工作交给机器。
- groupId:组织表示,一般为:公式网站的反写+项目名
- artifactId:项目名称,一般为:项目名-模块名
- version:版本号,形式为:0.0.1-SNAPSHOT
0.0.1-SNAPSHOT
│ │ │ └─SNAPSHOT-快照版本、ALPHA-内测版本、BETA-公测版本、RELEASE-稳定版本、GA-正式发布
│ │ └─小版本号
│ └─分支版本号
└─大版本号
- packaging:打包方式,常用方式为:pom、jar、war
- clissifier:用来帮助定义构建输出的一些附属构建
- scope:作用域,设置依赖范围,
| 依赖范围 | 有效范围 | |
|---|---|---|
| compile(默认) | 编译依赖范围 | 编译、测试、运行classpath都有效 |
| provided | 已提供依赖范围 | 编译、测试有效 |
| runtime | 运行时依赖访问 | 运行有效(典例JDBC) |
| test | 测试依赖范围 | 只对测试有效(典例junit) |
生命周期
Maven 的生命周期是对所有的构建过程进行抽象和统一。
- clean:目的是清理项目
- default:目的是构建项目
- 编译compile -> 测试test -> 打包package -> 安装install
- site:目的是建立项目站点
maven继承和聚合
继承
避免重复,可以让项目更安全。
在项目开发过程中,可以多个模块独立开发,但多个模块可以依赖相同的公共模块。
把公共的配置信息写道父模块中,子模块只要继承父模块,也会继承父模块的配置信息。
可继承的pom元素
记录常用的元素:
- groupId:项目组ID,项目坐标的核心元素
- version:项目版本,项目坐标的核心元素
- properties:自定义的maven属性
- dependencies:项目的依赖配置
- dependencyManagement:醒目的依赖管理配置
聚合
开发中,将项目划分几个模块:
- 公共模块common
- 系统模块system
- 日志模块log
- 统计模块reports
- 监控模块monitor等
示例
| 模块 | 名称 | 作用 | 项目 | 打包方式 |
|---|---|---|---|---|
| 父工程 | hami_parent | 维护四个模块关系,维护依赖管理,不做实现 | 创建maven Java项目 | 打pom包 |
| 公共模块 | hami_core | 做业务层和持久层,操作数据库的操作 | 创建maven Java项目 | 继承父工程打包方式 |
| 前台模块 | hami_portal | 做控制层和表现层,既有页面又做逻辑处理 | 创建maven JavaWeb项目 | 打war包 |
| 后台模块 | hami_console | 做控制层和表现层,既有页面又做逻辑处理 | 创建maven JavaWeb项目 | 打war包 |
| 云服务器模块 | hami_file | 存储图片等文件 | 创建maven JavaWeb项目 | 打war包 |
私服架构
正式开发,不同的项目组开发不同的工程。maven-dao 工程开发完毕,发布到私服maven-service 从私服下载 dao。
什么叫私服?
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服。
私服服务器即是公司内部的 maven 远程仓库,每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。
私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载。
Nexus
Nexus 是 Maven 仓库管理器,通过 nexus 可以搭建 maven 仓库,同时 nexus 还提供强大的仓库管理功能,构件搜索功能等。
Nexus仓库类型
- hosted:宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases 公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库。
- proxy:代理仓库,用于代理远程的公共仓库,如 maven 中央仓库,用户连接私服,私服自动去中央仓库下载 jar 包或者插件。
- group:,仓库组,用来合并多个 hosted/proxy 仓库,通常我们配置自己的 maven 连接仓库组。Group仓库组也是可以自己进行定制的。
- virtual(虚拟):兼容 Maven1 版本的 jar 或者插件。
Nexus常用命令
- 安装:nexus.bat install
- 启动服务: nexus.bat start
- 停止服务: nexus.bat stop
- 卸载: nexus.bat uninstall
maven私服实战
nexus安装
- 解压:解压资料中的nexus-2.12.0-01-bundle.zip 文件,存放到一个不含中文的目录下。
查看conf文件下的nexus.properties 配置文件,可以修改对应的配置:
- 安装启动:
- 使用管理员运行 cmd 命令窗口
- 切换目录nexus\nexus-2.12.0-01\bin (自己的安装目录下)目录下
- 执行 nexus.bat install 进行安装(若已安装,该命令忽略)
- 然后,执行 nexus.bat start 启动服务。
- 访问图形化界面:打开浏览器,输入http://localhost:端口号/nexus访问
- 登录:点击log in,进行登录。用户名:admin 密码:admin123
将项目发布到私服
- 在客户端即部署要部署的工程电脑上配置maven环境,修改maven下的setting.xml文件,配置连接私服的用户和密码。
在servers节点间进行配置:<!-- 定义稳定版本的id名称,用户名密码 --> <server><id>releases</id><username>admin</username><password>admin123</password> </server> <!-- 定义开发版本的id名称,用户名密码 --> <server><id>snapshots</id><username>admin</username><password>admin123</password></server> - 配置项目pom.xml,配置私服仓库的地址,本公司的自己的jar包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库
- 如果版本为release则上传到私服的release仓库
- 如果版本为snapshot则上传到私服的snapshot仓库。
注意:这里的 id 标签的值要和 settings.xml配置文件中的id值保持一致。<distributionManagement><repository><id>releases</id><url>http://localhost:8079/nexus/content/repositories/releases/</url></repository><snapshotRepository><id>snapshots</id><url>http://localhost:8079/nexus/content/repositories/snapshots/</url></snapshotRepository> </distributionManagement> - 在该工程中执行
deploy命令,发布项目到私服上。


- 查看私服结果

上述过程是SNAPSHOT快照版本发布到私服上,你可以尝试发布RELEASES稳定版本的jar包到私服,过程是一样的,将不再写过程。
从私服下jar包
有三种方式:setting.xml配置私服镜像、项目pom.xml配置仓库、setting.xml配置全局
三种方法任选其一。
方法一:setting.xml配置私服镜像
- 在setting.xml配置文件中,配置私服的镜像文件
<mirror><!-- id名称 --><id>nexusmaven</id><!-- 表示拦截所有的请求,都重定向到私服,从私服下载jar包,私服没有再去中央仓库下载 --><mirrorOf>*</mirrorOf> <name>nexus maven</name><!-- 私服的组地址 --> <url>http://localhost:8079/nexus/content/groups/public/</url> </mirror> - 先把自己的某个项目发布到私服中,然后删除掉本地仓库中的jar包(可以从deploy日志中查看jar包的路径),再使用其他项目去依赖该jar包,查看是否从私服中下载。
在其它项目中引入改坐标依赖。<dependencies><dependency><groupId>com.qcby</groupId><artifactId>mavenJava</artifactId><version>1.0-SNAPSHOT</version></dependency> </dependencies>
方法二:项目pom.xml配置仓库
可以配置仓库的方式,可以修改项目的pom配置文件,添加仓库的配置。
<repositories><repository><id>nexus</id><name>nexusmaven</name><url>http://localhost:8079/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>
<pluginRepositories><pluginRepository><id>public</id><url>http://localhost:8079/nexus/content/groups/public/</url><name>pluginRepositories</name></pluginRepository>
</pluginRepositories>
上面的方式不是特别的理想,需要在每一个项目的pom文件中都添加相同的配置,比较麻烦。
方法三:setting.xml配置全局
- 可以在settings.xml配置文件中添加配置,完成统一的设置。
<!-- 下载jar包配置 --><profile> <!--profile的id --><id>dev</id><repositories><repository> <!--仓库id,repositories可以配置多个仓库,保证id不重复 --><id>nexus</id> <!--仓库地址,即nexus仓库组的地址 --><url>http://localhost:8079/nexus/content/groups/public/</url> <!--是否下载releases构件 --><releases><enabled>true</enabled></releases> <!--是否下载snapshots构件 --><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也 需要从私服下载插件 --><pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 --><id>public</id><name>Public Repositories</name><url>http://localhost:8079/nexus/content/groups/public/</url></pluginRepository></pluginRepositories></profile> - 激活配置:
<activeProfiles><activeProfile>dev</activeProfile> </activeProfiles>
第三方jar包发布到私服
- 把jar包安装到本地仓库
- 方法一:通过maven中央仓库下载对应的jar包,放到不含中文的目录下
- 方法二:通过命令下载
mvn install:install-file -DgroupId=com.mysql -DartifactId=mysql-connector-j -Dversion=8.2.0 -Dfile=D:\nexus\mysql-connector-j-8.2.0.jar -Dpackaging=jar
- 把jar包到私服
- 先在settings.xml配置文件中配置用户名密码
<server><id>thirdparty</id><username>admin</username><password>admin123</password> </server> - 上次到私服
mvn deploy:deploy-file -DgroupId=com.mysql -DartifactId=mysql-connector-j -Dversion=8.2.0 -Dpackaging=jar -Dfile=D:\nexus\mysql-connector-j-8.2.0.jar -Durl=http://localhost:8079/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
- 先在settings.xml配置文件中配置用户名密码
