1.maven的作用
参考地址:http://maven.apache.org/index.html
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
Apache Maven是一个软件项目管理和管理工具。基于项目对象模型(POM)的概念,Maven可以中心化管理项目的构建、报告和文档。
2.下载和安装
下载地址:http://maven.apache.org/archetype/download.cgi
安装 :
注意:在maven安装之前,一定要已经安装了jdk。
只需要将maven所在的目录的bin文件夹配置到Path环境变量中,这样做的目的是在命令行的任意目录下,都可以使用mvn命令来操作。
新增环境变量MAVEN_HOME,类比JAVA_HOME,把maven所在的目录配置到这个MAVEN_HOME中
需要把maven目录的bin的目录下下配置到Path环境变量中,添加%MAVEN_HOME%/bin;
3.maven的配置
配置文件一般在maven的目录下的config的目录中,有个setting.xml,这里是全局的配置
但是也可以是在仓库下的setting.xml,默认是没有这个文件,可以拷贝maven的目录下的config的配置文件到仓库下的setting.xml
默认的加载顺序如下:
4.maven的目录结构
bin目录:包含了maven运行的一些命令脚本
boot目录:包含的是类加载器的一些东西
conf目录:configuration配置的,保存一些配置文件的
lib目录:保存jar包的
5.maven项目目录结构
项目目录结构,实际上指的是maven要求你的项目必须的一个目录层次。
约定优于配置 (Convention Over Configuration)
要去使用maven帮你进行jar包的管理,以及项目的构建和管理等等,你就要遵循maven的规定/约定
maven要求的你的工程结构必须是哪样哪样的。
6.maven配置文件之settings.xml
该文件是maven的全局配置文件
mirrors标签,表示配置镜像所在的路径的
一方面国外镜像的地址下载速度比较慢,所以可以考虑国内镜像的地址,比如阿里云的。
下面就配置几个镜像,第一个为阿里云的镜像地址
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
ui
central
Human Readable Name for this Mirror.
http://uk.maven.org/maven2/
osc
central
http://maven.oschina.net/content/groups/public/
osc_thirdparty
thirdparty
http://maven.oschina.net/content/repositories/thirdparty/
localRepository
表示配置仓库的地址
默认路劲下是${user.home}/.m2/repository的地址,就是用户目录下的.m2/repository的地址,如果需要变更,可以指定变更的地址
如果一个jar包已经在本地仓库中有了,注意这个jar包版本一定是要一致的才算有了,如果版本不一致,不能算作有,比如版本3.8.1,3.8.2算不同的jar,如果你自己上传jar到私服了,但是jar有更新了,再次上传到私服中,此时本地仓库的jar不会再更新,需要删除本地的jar,重新拉取最新的远程仓库的jar
其他如果有了,那么就不会再次去重复下载。
D:\repository
interactiveMode
标识maven是否需要和用户交互以获得输入
如果maven需要和用户交互以获得输入,那么则设置成true,不然则设置为false
offline
标识maven是否需要在离线模式下运行
pluginGroups
当插件的组织id(groupId)没有显示提供时,供搜寻插件组织Id的列表
proxies
用来配置不同的代理的
servers
仓库的下载和部署是在pom.xml文件中进行定义的。比如说用户名,密码需要访问远程仓库的时候,有时候需要安全认证,这个认证就可以配置在servers标签中
nexus-snapshots
admin
admin123
profiles
根据环境参数来调整构建配置的列表
7. maven配置文件之pom.xml
先给出一个缩减版的pom的基本配置
4.0.0
com.gp.springmvc
sunkang-springmvc
pom
1.1-SNAPSHOT
sunkang出品
sunkang-web
sunkang-dal
sunkang-biz
${project.version}
4.3.7.RELEASE
1.3.0
UTF-8
UTF-8
UTF-8
1.8
UTF-8
com.gp.springmvc
sunkang-common-lib
${project-version}
com.gp.springmvc
sunkang-dal
${project-version}
com.gp.springmvc
sunkang-biz
${project-version}
org.springframework
spring-context
${org.springframework-version}
commons-logging
commons-logging
org.springframework
spring-webmvc
${org.springframework-version}
org.springframework
spring-tx
${org.springframework-version}
org.springframework
spring-jdbc
${org.springframework-version}
org.springframework
spring-test
${org.springframework-version}
org.apache.maven.plugins
maven-compiler-plugin
3.1
${java.version}
${java.encoding}
lib
groupId,artifactId,version
由groupId,artifactId,ersion所组成的就可以唯一确定一个项目,三个标签是必填标签
groupId标识的项目组(填写公司的域名反写)
artifactId项目名称
version版本号
dependencies
这个标签就是用来配置我们项目中具体需要哪些jar包
properties
用来定义pom中的一些属性的,一般指定版本号
build
指定如何构建当前项目的,下面可以有资源标签和插件标签
source: 指定了当前构建的source目录
plugin: 指定了进行构建时使用的插件
packging
指定当前构建项目的类型
类型可以为war,jar,pom
指定为pom类型,说明这个项目包含多个子模块,需要定义父pom的打包类型为pom
modules
表明定义了哪些子模块
dependencyManagement
依赖管理,主要是在父pom声明需要用到的依赖,然后子pom再去引用这里声明的依赖,这样就不需要指明版本号
只能出现在父pom
统一版本号
声明依赖的jar(子POM里用到再引用)
dependency
举个例子
org.springframework
spring-context
${org.springframework-version}
commons-logging
commons-logging
type
默认为jar,一般可以不写
scope
默认值为compile,这个值决定了是否需要打包到target中,决定什么阶段需要
compile, 编译时需要,会打包到target中年,例如spring-core
test ,表明为测试时需要
provided ,编译时需要,不会打包到target 例如 servlet
runtime ,运行时需要,编译可能不需要,会打包到target, 例如JDBC驱动实现
system , 定义本地一些jar, 搭配systemPath一起使用,指明路劲,例如短信jar
exclusions
排除依赖的包
profiles
profies可以定义不同的环境,比如可以定义开发,测试,以及生产的环境,可以在打包的时候可以指定不同的环境,比如mvn clean package -Pdev
dev
dev
true
src/main/resources_env/dev
src/main/resources
qa
qa
src/main/resources_env/qa
src/main/resources
online
online
src/main/resources_env/online
src/main/resources
补充知识:
在一个项目中,可能存在不同的不同的子模块,但是子模块之间存在一些依赖,这里就会涉及依赖仲裁,一般会遵循下面的两个原则
最短路径原则
加载先后原则
查看项目中jar的依赖关系
mvn dependency:tree > tree.txt,
8.生命周期以及常用命令
1.A Build Lifecycle is Made Up of Phases
2.A Build Phase is Made Up of Plugin Goals
可以看出,生命周期由不同的clean,default,site的不同阶段构成,而不同阶段是由插件的goals的构成
常用命令
compile 编译
clean 删除target/
test 运行test,test case junit/testNG
package 打包
install 把项目install到local repo
deploy 发本地jar发布到remote
一般组合的常用命令
mvn clean compile ,清理并编译
mvn clean package ,清楚并打包
mvn clean package -Dmaven.test.skip=true ,跳过测试,并清理打包
9.archetype 自定义模板
生成一个archetype,这里需要先定义好你的初始化的archetype,可以声明你的jar的依赖,以及子模块的结构,然后切换到父pom.xml的目录中,执行下面的语句
mvn archetype:create-from-project
cd /target/generated-sources/archetype
mvn install
从archetype创建项目 mvn archetype:generate -DarchetypeCatalog=local
·10.私服搭建
如果使用的是国外镜像,那么下载速度比较慢
如果使用的是阿里云镜像,速度还算ok,但是假如网速不好的时候,其实也是比较慢的
如果没有网的情况下更加下载不了
团队开发的时候,是不是每个人在自己的本地仓库都需要下载一份呢?
能不能大家共用一份呢?
当我们某个maven项目需要一份jar包的时候,mysql-connector.jar
先看一下你本地仓库是否有这样jar包(版本也要判断),如果有,则不下载
如果没有,则去下载,并且保存到本地仓库中,然后以后需要的话,就不需要下载了
在项目中进行开发的时候,仅仅就是将本地仓库的jar包导入到工程里面即可,再也不用
像传统原始方式那样,每个项目中都要一份单独的jar包,这样会造成jar包的冗余。
私服发布
搭建私服自行百度安装,假设我们安装好了之后,想要发布jar到私服该该怎么做
例如搭建的私服的地址为: http://localhost:8081/nexus
账号密码为:admin/admin123
需要修改setting.xml的配置文件
nexus-snapshots
admin
admin123
nexus-releases
admin
admin123
需要修改pom.xml
nexus-snapshots
http://localhost:8081/nexus/content/repositories/releases
true
nexus-releases
http://localhost:8081/nexus/content/repositories/snapshots
true
私服下载
方法一:需要配置setting.xml的mirror配置
方法二:配置好pom.xml的profile的仓库下载配置
这里配置在dev的profile的一个仓库下载的地址,也可以配置site和prod的仓库地址,一般来说dev和site的仓库的地址有的公司要分开的,这样可以根据profile的不同配置不同的环境的仓库地址,可以实现根据环境不同拉取不同的仓库的jar
dev
dev
true
src/main/resources_env/dev
src/main/resources
maven-net-cn
Maven China Mirror
http://maven.net.cn/content/groups/public/
true
false
test
test
src/main/resources_env/dev
src/main/resources
maven-net-cn
Maven China Mirror
http://maven.net.cn/content/groups/public/
true
false