翻译为“专家”,“内行”(在这指项目构建专家)
Maven是Apache基金会下一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
跨平台:可以再Windows、Linux、Mac os等系统上运行
Maven的最大作用就是构建项目。
什么是构建
Maven的作用
1.创建项目——创建的项目具有统一的项目结构
2.引入依赖的jar文件——jar包会存放在仓库中
3.打包发布项目——可以将项目打包成开发人员指定的类型,用于部署到Web容器。还可以将项目打包到仓库中,方便项目的相互依赖。
Maven模型
1.项目对象模型(Project Object Model):通过 pom.xml 描述项目基本信息,并加载项目
2.依赖管理模型(Dependency):管理jar包以及jar包之间的依赖,需要什么jar包只要在pom.xml文件中配置就可以,Maven会自动下载到本地jar包仓库中(从central(中央仓库)、b2b(私服仓库)、local(本地仓库)仓库中下载)
3.Build lifecycle phases:Maven 构建项目的整个生命周期过程是由一个一个插件完成的。每个插件完成一个特殊的功能,并产出一些文件。
Maven的运行依赖于生命周期中的每一个阶段,每一个阶段都对应一个或多个插件,每个插件执行一个功能。
本地仓库
Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。
远程仓库——Nexus私服
私服也属于远程仓库的一种,只是这个远程仓库的地址是本地服务器而已
配置在局域网环境中,为局域网中所有开发人员提供jar包的统一管理
本地仓库(本机)--->私服(局域网)--->中心仓库(外部网络)
远程仓库——其他公共库
一些知名公司将收集的依赖构建而成的仓库,并将仓库地址发布到网络中提供其他用户使用。比如阿里巴巴的公共库
远程仓库——中央仓库
由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令时下载到需要的构件。中央仓库就是一个默认的远程仓库。Maven的安装文件默认带了中央仓库的配置
maven自己的中央库访问速度很慢
公司开发的自己的jar包等其他代码源,不想公开分享,就只有放到私有服务器上存放
有的jar包或者代码源中央库没有的,或者使用得老版本中央库没有的,我们需要私有服务器存放这些数据,用到的时候下载的速度也会很快
在Maven项目中都包含一个pom.xml文件,在该文件中通过配置依赖的坐标,Maven项目就会去仓库中查找并引入所需要的依赖。
仓库优先级:本地→私服→其他公共仓库→中央仓库
1.确认jdk是否已安装?(maven3.3以上的版本要求JDK最低为1.7)
echo %JAVA_HOME%
java -version
javac
2.下载maven网址:Maven – Download Apache Maven
3.对下载的apache-maven-3.6.1-bin.zip进行解压,解压到硬盘目录(解压目录最好不要有中文字)即可完成maven的安装
4.配置环境变量
MAVEN_HOME------->其值为maven安装的路径
path------->其值为maven安装的路径\bin
5.在dos窗口中运行命令mvn -v或mvn -version,显示如图所示的内容证明安装成功了。
Maven安装目录分析
bin:含有mvn运行的脚本(二进制可运行指令)
boot:含有plexus-classworlds类加载器框架(java语言在加载的时候有一个类加载器,Maven有自己的专用的类加载器,jdk类加载器将Maven类加载,Maven再启动自己的类加载器加载其它Maven类)
conf:含有settings.xml配置文件
lib:含有Maven运行时所需要的java类库(Maven本身是用Java写的,它的运行需要一些资源jar包)
LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍
Maven的主要功能之一是管理构建项目所需要的jar文件,那么从哪里下载,下载到哪里就成为必须要解决的问题,Maven使用settings.xml指定这些配置信息。
默认仓库——当前用户路径C:\Users\[UserName]\.m2
全局范围:Maven安装目录,如:D:\ruanjian\apache-maven-3.6.1\conf\settings.xml,对所有用户均有效。
修改默认仓库的位置
用户范围:当前用户目录,如D:\ruanjian\maven\settings.xml,仅对当前用户生效。
两个目录都可以出现settings.xml,最后取合并后的结果,如果存在重复定义,那么当前用户目录的配置项优先生效。通常是把全局范围内的settings.xml作为模板复制到用户范围目录中。
settings.xml使用仓库来管理jar文件的下载,分为本地仓库和远程仓库,分别使用下面的两个节点配置:
https://blog.csdn.net/qidasheng2012/article/details/78152581
注意:用户级别的仓库在全局配置中一旦设置,全局配置将不再生效,转用用户所设置的仓库,否则使用默认路径仓库
在IDEA中构建Maven项目
1.创建maven项目
2.设置项目的maven坐标
3.设置maven项目的属性
Maven项目的标准目录结构
src/main/java —— 存放项目的.java文件
src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
src/main/webapp—— Web项目根目录
src/test/java —— 存放所有测试.java文件,如JUnit测试类
src/test/resources —— 测试资源文件
target —— 项目编译构建的输出位置(可以自动生成)
pom.xml——maven项目核心配置文件
案例:
详见第1个Maven项目.txt
一个项目依赖另一个项目
详见第2个Maven项目.txt(依赖1)
详见第3个Maven项目.txt(依赖1、2)
第一次执行maven命令时,会自动下载相应的maven插件,插件会被下载到maven仓库中
仓库位置:仓库路径\repository\org\apache\maven
断网后下载失败,再次连接无法下载的解决方案。
删掉仓库中对应资源文件夹下的xxx.pom.lastUpdated文件后,修复网络重新下载
Maven核心概念 |
坐标、依赖管理、仓库管理、生命周期、插件和目标、聚合继承 |
Maven坐标
什么是坐标?
在平面几何中坐标(x,y)可以标识平面中唯一的一点
Maven坐标主要组成
Maven为什么使用坐标?
Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范
拥有了统一规范,就可以把查找工作交给机器
http://mvnrepository.com/
pom文件中的其他标签
需要指定父依赖的groupId、artifactId、version和relativePath(relativePath父项目的pom.xml文件的相对路径)
<dependency>:dependencies的子节点,定义引入某个依赖。
详细见 dependency标签_疙瘩陈的博客-CSDN博客_dependency标签
org.apache.commons
commons-lang3
3.3.2
compile
./commons-lang3.jar
false
aopalliance
aopalliance
<properties>:定义一些常量,可在pom文件的其他地方引用
UTF-8
mavenmodule
maven-compiler-plugin
3.1.0
Maven生命周期
何为生命周期?
生命周期是指一个事物从创建到消亡的整体过程
Maven生命周期指Maven整体的构建过程
生命周期Maven有三套相互独立的生命周期:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等。
Site Lifecycle 生成项目报告,站点,发布站点
再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
Maven Core – Lifecycles Reference
首先需要在idea中对maven进行集成,目录为File---->Setting---->Build、Execution、Deployment---->Build Tools---->maven,
集成了Maven之后,也集成了对maven命令的图形化操作。再idea中通过菜单View->Tool Windows->Maven,打开Maven操作的界面:
在IDEA中开启热部署
修改代码后,不需要重启项目,就可以更新部署
IDEA默认没有开启热部署,开启步骤如下
1.使用组合键 Ctrl+shift+alt+/ 打开Maintenance窗口,选择“1.Registry…”
2.勾选 compiler.automake.allow.when.app.running
3.在pom.xml中添加依赖
org.springframework.boot
spring-boot-devtools
true
4.在pom.xml中配置plugin
org.springframework.boot
spring-boot-maven-plugin
true
org.springframework
springloaded
1.2.5.RELEASE
5.在idea中,单击File--->Setting,在打开的窗口中单击“Build、Execution、Deployment”--->compiler,在弹出的窗口中勾选“build project automatically”选项。
在IDEA中使用maven创建ssm框架项目
(将之前的写好的ssm学生项目改造为maven项目)
1.创建maven-web项目
2.创建目录结构
src/main/java 指定为Sources Root
src/main/resources 指定为Resources Root
3.配置pom.xml,引入ssm框架需要的jar包+mysql驱动jar+jstl/el+数据校验+log4j+junit等等jar包
UTF-8
1.7
1.7
5.2.2.RELEASE
org.springframework
spring-core
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-tx
${spring.version}
aopalliance
aopalliance
1.0
org.aspectj
aspectjweaver
1.6.9
org.mybatis
mybatis
3.5.1
mysql
mysql-connector-java
8.0.19
commons-dbcp
commons-dbcp
1.4
org.mybatis
mybatis-spring
2.0.3
javax.servlet
jstl
1.2
taglibs
standard
1.1.2
log4j
log4j
1.2.17
junit
junit
4.12
test
com.alibaba
fastjson
1.2.13
org.hibernate
hibernate-validator
5.1.0.Final
javax.el
javax.el-api
3.0.0
commons-fileupload
commons-fileupload
1.2.2
commons-io
commons-io
2.4
javax.servlet
javax.servlet-api
3.1.0
provided
4.将学生项目中xml的内容复制到web.xml中,注意这里面的节点有顺序要求
Archetype Created Web Application
contextConfigLocation
classpath:ApplicationContext-*.xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
springmvc
/
5.将学生项目中src下的包及java代码还有映射文件一并赋值到现在的src/main/java下
这里需要注意mapper的映射文件由于在src下,是无法加载到的,可以在pom.xml中配置
src/main/java
**/*.properties
**/*.xml
false
src/main/resources
**/*.properties
**/*.xml
false
6.将学生项目中的配置文件复制到src/main/resources下
7.根据配置文件中指定的静态文件路径,在webapp下创建对应的文件夹用于存放静态文件,这里我配置的是statics
8.将学生项目中的页面复制到WEB-INF下
这里需要注意如果页面无法识别el表达式,可以设置page指令,开启
<%@ page isELIgnored="false"%>
为何需要私服
实际开发中,通过中央仓库获取构件往往存在各种问题
网速慢,下载时间长,效率低
多人重复下载,浪费带宽,且版本可能不一致
不利于公共构件的管理和维护
第三方构件未在中央仓库发布,或更新不及时
搭建Maven私服
局域网内下载速度优于远程仓库,节约带宽
版本统一
可自行进行构件的管理和维护(项目模块所依赖的公共构件、第三方构件)
常见Maven私服
Apache Archiva
Artifactory
Sonatype Nexus
强大的Maven仓库管理器
使用文件系统 + Lucene来组织数据
bundle版安装包内嵌Jetty容器
Nexus专业版是需要付费的,这里我们下载开源的Nexus OSS
1.首先确定我们的环境安装好maven,jdk等必须的环境;jdk:要1.6版本以上。
echo %JAVA_HOME%
java -version
echo %MAVEN_HOME%
mvn -version
2.这些都准备好之后,下载nexus ,下载地址:http://www.sonatype.org/nexus/go
3.打开目录nexus-2.x.x-xx-bundle\nexus-x.x.x-xx\bin\jsw 这个目录下面你会发现有很多系统版本的nexus环境,根据个人的电脑系统选择对应的版本:例如win7 (64)位的系统,选择windows-x86-64这个版本
4.打开一个版本你会看到如下文件:
console-nexus.bat:启动nexus服务器,命令行窗口,关闭后,不会驻留在windows服务中
install-nexus.bat:将nexus安装成为windows服务
start-nexus.bat:启动服务
stop-nexus.bat:停止服务
uninstall-nexus.bat:卸载nexus在windows中的服务
5.启动服务,访问http://localhost:8081/nexus/ 启动后如下页面,在右上角有个Log in 的超链接,点击登录
默认的用户名是 admin 密码是 admin123
私服默认的端口号为8081;如何修改端口号?
找到你的nexus的所在目录,打开nexus根目录下的conf文件夹下的配置文件nexus.properties,打开文件找到大约第19行application-port=8081;修改为自己所需要的端口号即可
6.登录之后,可以点右上角的“admin -> Profile”可修改登录密码
7.私服的仓库说明
点击左侧Views/Repositories 中Repositories
Repository——Nexus内置仓库说明:
1) Public Repositories:该仓库组将上述某些仓库聚合(可在仓库的Configuration中配置)并通过一致的地址提供服务
2) 3rd party:用来部署无法从公共仓库获得的第三方发布版本的jar包
3) Apache Snapshots:用来代理Apache Maven仓库的快照版本jar包
4) Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本jar包
5) Central M1 shadow: 用于提供中央仓库中M1格式的发布版本的组件镜像仓库
6) Releases:用户部署组织内部的发布版本的jar包
7) Snapshots:用来部署组织内部的快照版本的jar包
Type——仓库类型说明:
1) group:仓库组,用来合并多个hosted/proxy仓库,通常我们配置maven依赖仓库组
2) hosted:本地仓库,通常我们会部署自己的构件到这一类型的仓库。 包括3rd party仓库,Releases仓库,Snapshots仓库
3) Proxy:代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库
4) virtual:虚拟仓库
Format——2中仓库格式:maven1、maven2
Policy——2中仓库版本策略:
snapshot:快照版本,相对不稳定
release:发行版本,即稳定版本
Repository Path——仓库访问地址
8.设置下载远程索引到本地
9.然后在Central仓库上右键然后点击Repair Index 即可下载中心仓库的索引文件,稍等几分钟点击下边的Browse Index即可看见下载的索引文件。
一般远程仓库比较大,构件较多,索引文件会很大;由于因特网宽带的限制,我们不推荐在线方式,强烈推荐使用本地方式。
下载索引相关文件及索引构建工具
从 Central Repository: .index 下载索引相关文件
nexus-maven-repository-index.gz
nexus-maven-repository-index.properties
从 Central Repository: org/apache/maven/indexer/indexer-cli/5.1.0 下载Maven索引构建工具indexer-cli-5.1.0.jar
停止Nexus服务;使用索引构建工具解压索引文件,将下载的三个文件放置在同一目录下
执行命令:java -jar indexer-cli-5.1.0.jar -u nexus-maven-repository-index.gz -d indexer
清空D:\ruanjian\nexus-2.14.1-01-bundle\sonatype-work\nexus\indexer\central-ctx中的文件,
将解压生成的indexer目录中的索引文件全部移动到索引目录D:\ruanjian\nexus-2.14.1-01-bundle\sonatype-work\nexus\indexer\central-ctx中。
10.这样设置以后,重新启动Nexus,访问Nexus管理页面,在Browse Index选项卡点击刷新按钮即可显示更新后的索引
可以在左边菜单栏里面找到Artifact Search,在输入框里面输入你想要搜索的组件名字,比如:hibernate, 那么查询结果如下:
11.点击其中一个版本的信息,可以查看pom信息
二、配置从私服下载资源
1.在本地仓库的settings.xml文件中配置,在
配置的是组 ,当前的组中有
nexus
*
http://localhost:8081/nexus/content/groups/public
2.修改项目pom文件,设置下载仓库(repository),代码如下:在标签下添加
public
Team Maven Repository
http://localhost:8081/nexus/content/groups/public
true
true
3.这时就可以使用在项目中私服下载所需资源了,查找私服dependency配置信息,从私服上搜索自己想要的jar包,然后将依赖拷贝到 pom.xml中,项目会自动更新;但是由于私服中的访问的远程仓库是中央仓库,访问下载时间较长,所以建议在私服上添加阿里代理仓库
3.1输入名称和地址
3.2保存完毕后可能出现这种情况 in service - Remote Automatically Blocked and Unavailable(远程自动阻止和不可用)
3.3修改方法是:把Auto Blocking Enabled 修改为 false
3.4修改后的样子
3.5把新添加的仓库 添加到组仓库并调整位置
3.6这样通过私服下载 jar时 阿里镜像仓库会优先中央仓库下载,提高速度。
演示:
将mysql8.0.20版本的信息dependency复制到pom文件
这时下载该版本的jar文件的路径为私服路径,切记要联网(之后再下载同版本的jar就不需要联网了)
1.在项目的pom.xml中配置发布目的地,在标签下添加
releases
http://localhost:8081/nexus/content/repositories/releases/
snapshots
http://localhost:8081/nexus/content/repositories/snapshots/
2.在本地仓库的settings.xml文件中配置发布权限,在
releases
admin
admin123
snapshots
admin
admin123
演示:
编写一个项目maven05_sifu,在项目中写一个方法;在IDEA中,通过maven操作中的deploy,可以上传war(maven-java就是jar)到Nexus私服仓库
这样其他的项目就可以通过引用该项目的dependency信息,使用此项目中的代码了
注意:私服一般安装在内网的其他服务器上,而不是本机上。因此上面的配置中localhost的部分在实际情况中应该修改为公司中内网的私服服务器地址。
1.下载oracle jdbc jar包或者安装oracle,从oracle的安装目录中找到jar包;安装目录:\oracle\product\10.2.0\db_1\jdbc\lib\jar:ojdbc14.jar
2.在Nexus中配置:
添加后如下图所示,点击“update Artifact(s)”:
4.配置完成后就可以引入oracle的jar包了