Maven
Maven简介
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM,Project Object Model)概念,Maven利用一个中央仓库能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。。
官网地址:Maven下载地址(官网)
Maven核心功能
一般项目的问题
1. 需要把jar复制到项目中,繁琐
2. 项目体积更大,不利于维护
3. 不利于团队开发
Maven主要有两大核心功能:
1. 依赖管理。(jar包的管理)
2. 项目构建。(清理、编译、单元测试、打包、安装、部署、运行)
Maven下载
配置Maven环境变量
1.右键我的电脑(或者计算机)-属性-高级系统设置-高级-环境变量-系统变量-新建MAVEN_HOME,值为maven的安装目录
2.把%MAVEN_HOME%\bin;追加到Path变量的值后面
3.检验是否成功:cmd-> mvn -v 或 mvn -version
4.修改配置文件:maven安装目录下conf目录中settings.xml
配置Maven仓库
Maven使用仓库管理各种jar包和插件
Maven仓库分为:本地仓库(local)、远程仓库(remote)两大类
本地仓库: 本地电脑中的仓库。默认位置为: ${user:home}/.m2/repository
远程仓库: 远程仓库又包括:中央仓库+私服+其它公共远程仓库 (比如阿里、163等)
中央仓库:是maven自带的远程仓库,默认地址:Maven自带的远程仓库,由于默认中央仓库的服务器在国外,下载会比较慢,一般需要配置使用国内的公共远程仓库作为中央仓库镜像。注意配置了中央仓库镜像就不再走默认中央仓库
私服:是架设在本机或者局域网中的一种特殊的远程仓库,通过私服可以方便的管理其它所有的外部远程仓库
配置:
<!--第一个位置在根节点下添加本地仓库位置-->
<!--你想要把下载的jar包放在哪-->
<localRepository>D:\Repositories\Maven</localRepository>
<!--第二个位置,在mirrors节点下添加 中央仓库镜像-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!--第三个位置,在profiles节点下添加 jdk版本全局配置,因为默认为1.5-->
<profile>
<id>jdk18</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
检索顺序:
Maven常见命令
- clean 清理编译文件
- compile 编译文件
- test 编译并运行test目录的代码
- package 先编译,在测试,在打包
- install 安装,包括前面的编译,测试,打包
其他命令
mvn deploy:部署,部署到私服
mvn tomcat:run:运行
Maven构建生命周期
1. Clean:项目构建前的清理操作
2. Default(Build): 核心生命周期核心过程:编译,测试,运行,打包等等
3. Site:项目站点文档创建。
Maven POM文件
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标
POM 中可以指定以下配置:
项目依赖
插件
执行目标
项目构建 profile
项目版本
项目开发者列表
相关邮件列表信息
基本的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>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 SNAPSHOT 快照版 RELEASW 发布版-->
<version>1.0-SNAPSHOT</version>
<!--打包形式 例如jar、war、ear、pom-->
<packaging>jar</packaging>
</project>
所有的POM文件都需要project元素和三个必须元素:
groupid(公司名)
artifactid(项目名)
version(版本号)
这三个必须的元素叫做坐标(GAV)
【所有的内容都会生成了一个文件夹,生成的jar包的名字 项目名-版本号】
Maven引入外部依赖
pom.xml 的 dependencies(依赖关系) 列表列出了我们的项目需要构建的所有外部依赖项【相当于平常文件中导入的jar包,每一个jar包对应一个外部依赖】
例: junit-4.12.jar 这个jar包对应的dependencies(依赖关系) 列表中的依赖如下所示
<dependencies>
<!--坐标GAV-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--下面还可以添加多个依赖-->
</dependencies>
IDEA中配置Maven
第一步:安装插件
Idea自带maven插件,目前Idea不需要安装。
第二步:配置Maven
在Idea的启动初始界面,打开:Configure–>Settings–>Build,Execution,Deployment–>Maven
如下图
第三步:创建Maven工程
添加依赖
网搜索依赖进行添加: 推荐网站:搜索添加依赖需要的代码
示例:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
</dependencies>
添加到项目的pom文件内容说明(切换pom.xml到Dependencies目录下):
type:类型
取值说明:
jar:jar包
Scope:声明jar包的存活时间
取值说明:
1、provided:编译和测试时需要,打包和运行不需要 例如servlet-api jsp-api
2、compile:编译、测试、运行、打包需要 druid dbutils fileupload
3、runtime:测试、运行、打包需要 mysql驱动
4、test:测试 例如junit
5、system:编译和测试时需要,显示引用,Maven不会检索
使用Maven优化项目
- 创建项目
- 创建java,resources目录
- 修改web.xml版本
- 把静态资源复制到webapp目录下
- pom文件引入全部外部依赖(导入jar包)
- 运行 【一般自己配置tomcat】
特殊:安装仓库中没有的jar包
例:安装ValidateCode.jar包,先找到ValidateCode.jar所在的位置,然后cmd,在输入以下代码,下载包
mvn install:install-file -DgroupId=com.qf -DartifactId=validatecode -Dversion=1.0.0 -Dpackaging=jar -Dfile=ValidateCode.jar
Maven传递依赖
什么是传递依赖
当项目依赖一个jar包时,与这个jar包关联的其他jar包也会关联到当前项目,这种现象就是传递依赖。
比如A项目依赖B项目,B又依赖C项目, 此时A中也包含了C的依赖
A项目依赖B项目,就相当于把B项目中的jar包导入A项目
传递依赖出现的问题
例如:
A依赖B,A也依赖C,假如B和C中有相同的jar包,只是版本不一样,但是A只能用一个,这时就会出现问题
解决jar包冲突的方式
- 排除原则(常用)
例如:项目A依赖项目B,如果A不想用B中的某个jar包,就在< dependency > < /dependency >中间加上以下代码,以下代码是去除mysql依赖
<exclusions>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
- 版本号限定选择(常用)
方法:
1.添加属性(jar包的版本号)
2.版本锁定(指定用那个版本)
3.依赖管理(导入jar包)
<!-- 标记版本号 -->
<!--01添加属性-->
<properties>
<mysql.version>5.1.42</mysql.version>
</properties>
<!--02版本锁定-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 03依赖管理 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
- 路径就近原则(基本不用)
- 第一声明优先原则(基本不用)
注意:如果是直接依赖,不遵循第一声明原则,后面的会覆盖前面的
传递依赖对依赖范围的影响
A项目直接依赖 B项目 (最左边一列 A和B的依赖范围)
B项目直接依赖C 项目 (最上面一行B和C的依赖范围)
交叉点A和C的依赖范围
B依赖C为compile,A依赖C,看A依赖B
B依赖C为runtime,A依赖C,看A依赖B
特殊:A依赖Bcompile,B依赖Cruntime,A依赖Cruntime
依赖范围:
A 依赖B,需要再A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
(1)compile:编译范围, 编译范围的依赖会在编译,测试,运行,打包(war)都会使用依赖jar包
(2)provided:提供依赖,provided依赖在编译,测试时需要,运行,打包都不会包含。
(3)runtime:运行依赖,runtime依赖在运行、测试、打包的需要,但在编译的时候不需要,比如:jdbc的驱动包
(4)test:测试依赖,在编译和打包时不需要,他们只有在测试编译和测试运行时使用, 比如junit,也不会被打包
(5)system:系统依赖,system依赖与provided类似,但是你必须显示的提供一个对于本地系统中jar文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用
如图所示:
依赖范围 | 编译 | 测试 | 运行 | 打包(war) | 例子 |
---|---|---|---|---|---|
compile | yes | yes | yes | yes | beanutils、fileupload |
test | no | yes | no | no | junit |
provided | yes | yes | no | no | serlvet-api、jsp-api |
runtime | no | yes | yes | yes | jdbc驱动 |
system | yes | yes | no | no | 本地jar包。maven仓库之外的jar包 |
注意:
打包jar包时,不会包含任何依赖包的。
默认依赖范围:compile
依赖范围由强到弱的顺序是:compile–>provided–>runtime–>test
分块构建项目
- 创建父工程 在父工程中添加依赖,后面的模块都继承父模块,都可以使用jar包
- 创建子模块继承父模块
- 提交的时候点击父目录中的
聚合和继承
继承
开发中多个项目有共同的jar包依赖,可以采用继承方式简化各个项目的pom文件,在父类的pom文件中依赖共同拥有的jar。继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定mysql的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义。
注意:
1.父级项目只能是pom打包方式。
<packaging>pom</packaging>
2.子项目是一个Maven Module
<modules>
<module>xmservice</module>
<module>xmweb</module>
<module>xmdao</module>
</modules>
聚合:
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行。
能够把项目的各个模块聚合在一起构建。一般用于分模块开发,最后整体打包发布。
注意:
1.根项目(模块)是一个pom项目。
2.子模块:Maven Module
3.每个模块写完后需要上传到私服
4.打包,需要整体打包找到最后的war项目使用Tomcat加载
实际中,我们会将一些庞大的项目拆分为若干模块进行开发
三层+MVC 如下:
dao (包含实体类、utils)----------jar
service------jar
web----------war
私服
不同的项目组开发不同的工程,dao工程开发完毕,发布到私服。Service从私服下载dao
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的maven远程仓库,每个员工的电脑上安装maven软件并且连接私服服务器,员工将自己开发的项目打成jar并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)
搭建私服环境
下载nexus
Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。下载地址:私服下载地址
安装nexus
cmd进入bin目录,执行nexus.bat install
卸载nexus
cmd进入nexus的bin目录,执行:nexus.bat uninstall
启动nexus
方法1:
cmd进入bin目录,执行nexus.bat start
方法2:
windows服务中直接启动nexus服务
如何验证启动成功:
查看nexus的配置文件conf/nexus.properties
# Jetty section
application-port=8081 # nexus的访问端口配置
application-host=0.0.0.0 # nexus主机监听配置(不用修改)
nexus-webapp=${bundleBasedir}/nexus # nexus工程目录
nexus-webapp-context-path=/nexus # nexus的web访问路径
# Nexus section
nexus-work=${bundleBasedir}/../sonatype-work/nexus # nexus仓库目录
runtime=${bundleBasedir}/nexus/WEB-INF # nexus运行程序目录
访问:
http://localhost:8081/nexus/
使用Nexus 内置账户admin/admin123登陆:
点击右上角的Log in,输入账号和密码 登陆
nexus的仓库有4中类型:
- hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
- proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件。
- group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。
- virtual(虚拟):兼容Maven1 版本的jar或者插件
nexus仓库默认在sonatype-work目录中:
将项目发布到私服
1. 把dao模块上传到私服(如果上述setting.xml文件中配置过再次检查是否配置完整正确):
第一步:配置私服地址
1. 在settings.xml添加:
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
2.在当前项目的pom.xml文件添加:【上传哪个,在那个里面添加】
<!-- 配置远程发布到私服,mvn deploy -->
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
第二步: 运行 deploy命令,不同开发工具会有差异。
如果所有配置正确,发现上传私服失败,需要进入私服找到指定仓库
Repository--- Access Settings--Deployment Policy修改为允许发布
从私服下载jar包
3.service模块从私服下载dao包【一般这个需要配置】
1.1、在settings.xml文件中
<profile>
<id>dev</id>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
2.激活私服
<!-- 激活 -->
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
注意:
私服一般安装在内网的其他服务器上,而不是本机上。因此上面的配置中localhost的部分在实际情况中应该修改为公司中内网的私服服务器地址。