Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。
Maven主要功能
1.方便的发布项目信息(更易于项目周期完成:清理、编译、测试、打包、部署)
2.在多个项目中共享JAR(项目与项目之间依赖,CRM 需要使用SSH的所有jar,就说CRM依赖SSH)
通过配置文件确定使用的jar,不需要手动的导入jar。
Maven是一个项目管理工具,它包含:
• 一个项目对象模型 (Project Object Model) 。创建的都是maven项目。每一个maven项目根目录下都有一个配置文件pom.xml
• 一组标准集合(配置信息比较完善)
• 一个项目生命周期(Project Lifecycle)
• 清理、编译、测试、报告、打包、部署
• 一个依赖管理系统(Dependency Management System) ,解决项目与项目(jar包)之间依赖
约定优于配置的思想
maven规定以什么目录结构存放内容、规定输出到什么位置等。
Maven提供相应的插件完成项目周期的流程。maven的插件以jar项目体现。
maven使用插件 和 依赖的项目(jar) 本地默认都没有,但maven不需要我们下载,在使用maven时将自动的下载。maven关键:需要网络。且只需要下载一次。
2.1 下载
网址:http://maven.apache.org/download.cgi
版本:3.0.4
2.2 安装
解压:apache-maven-3.0.4-bin.zip
目录结构
2.3 配置环境变量
配置系统环境变量MAVEN_HOME (maven_home)
配置系统环境变量path (建议:path都是小写) , 注意:使用分号分隔
2.4 测试
方式1:cmd> mvn --version
方式2:cmd> mvn -v
步骤一:本地仓库:maven上网下载所有jar存放的位置成为本地仓库。
步骤二:解压本地仓库
步骤三:配置文件:%maven_home%/conf/settings.xml
步骤四:修改配置,配置本地仓库
4.1 名词介绍
Project:任何您想build(构建)的事物,Maven都可以认为它们是工程(项目)。这些工程被定义为工程对象模型(POM,Poject Object Model)。一个工程可以依赖其它的工程;一个工程也可以由多个子工程构成。
依赖:一个项目需要使用另一个项目
项目可以被拆分多个模块
POM:POM(pom.xml)是Maven的核心文件,它是指示Maven如何工作的元数据文件,类似于Ant中的build.xml文件。POM文件位于每个工程的根目录中。 maven取代ant
GroupId:groupId是一个工程的在全局中唯一的标识符,一般地,它就是工程名。groupId有利于使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。
组,要求:全球唯一,一般情况使用 域名倒写(包名)
Artifact:artifact 是工程将要产生或需要使用的文件,它可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId和 artifactId组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中,否则Maven无法找到 (识别)它们。
标识,一般情况项目名称
Dependency:为了能够build或运行,一个典型的Java工程会依赖其它的包。在Maven中,这些被依赖的包就被称为dependency。dependency一般是其它工程的artifact。
Plug-in:Maven是由插件组织的,它的每一个功能都是由插件提供的。插件提供goal(类似于Ant中的target),并根据在POM中找到的元数据去完成工作。主要的Maven插件要是由Java写成的,但它也支持用Beanshell或Ant脚本写成的插件。
Repository:仓库。
4.2 创建maven java项目
骨架:maven规定项目的结构,不同项目需要不同的骨架。
mvn archetype:create -DgroupId=com.itheima.maven.quickstart -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart
注意:使用名称创建项目,必须上网下载一个小文件
没上网可能会卡在这里↑
上网之后的效果↓
4.2.1 mavenjava项目结构【掌握】
pom.xml 核心配置,项目根下
src/main/java java源码目录
src/main/resources java配置文件目录
src/test/java 测试源码目录
src/test/resources 测试配置目录
target 输出目录
4.3 创建 maven web项目
mvn archetype:create -DgroupId=com.itheima.maven.quickstart -DartifactId=myWebApp -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot
4.3.1 mavenweb项目结构【掌握】
pom.xml 核心配置
src/main/java java源码
src/main/resources java配置
src/main/webapp myeclipse web项目中 WebRoot目录
|--WEB-INF
|--web.xml
src/test 测试
target 输出目录
4.4 命令操作
清理:clean --删除target目录
编译:compile --src/main/java目录java源码编译生成class (target目录下)
测试:test --src/test/java 目录编译
打包:package --生成压缩文件:java项目#jar包;web项目#war包 (压缩格式ZIP)
安装:install --将压缩文件上传到本地仓库
部署|发布:deploy --将压缩文件上传私服
命令格式# cmd> mvn 命令
注意:使用命令时,必须在maven根目录下,及可以看到pom.xml
安装位置:
完整生命周期,当执行生命周期后面命令时,前面步骤的命令自动执行
4.5 其他命令
• 转换Eclipse工程 (在pom.xml目录执行)
mvn eclipse:eclipse
mvn eclipse:clean //清除Eclipse设置信息
• 转换成IDEA 工程(在pom.xml目录执行)
mvn idea:idea
mvn idea:clean //清除idea设置信息
clean前后eclipse目录变化
5.1 插件安装(了解)
高版本的myeclipse或eclipse 内置maven插件,建议:使用高版本(myeclipse 10.0)
低版本eclipse插件安装
安装eclipse ,将“eclipse-3.7 32位.zip”解压
安装插件
5.2 myeclipsemaven配置【掌握】
5.2.1 配置位置
window→Preferences搜索maven
eclipse
myeclipse
5.2.2 取消索引下载
5.2.3 安装自定义maven
步骤一:选择 Installations
步骤二:选择add添加自己的maven安装路径
步骤三:点击应用 Apply 保存设置
5.2.4 配置maven
步骤一:选择 User Settings
步骤二:选择自定义settings.xml 文件
myeclipse默认配置文件位置:C:\Users\liangtong\.m2\settings.xml(.cache为索引下载位置)
步骤三:应用 保存设置
5.2.5 浏览本地仓库
步骤一: window/show view/other 搜索maven/ ,打开 “maven repositories” --maven仓库管理视图
步骤二:显示本地仓库
步骤三:重写构建索引,右键本地方库选择重新构建索引
再点击箭头展开就可以 查看仓库内容了
5.3 maven项目创建
5.3.1 mavenjava项目
步骤一:选择“maven project” ,如果右键新建没有,通过other获得
步骤二:选择项目位置,默认不变
步骤三:选择骨架quickstart
步骤四:设置项目参数
创建后的结果:需要手动创建源码目录
5.3.2 mavenweb项目
步骤一:创建maven项目,同上
步骤二:选择路径,同上
步骤三:选择骨架webapp
步骤四:项目参数,同上
创建结果
5.3.3 maven自定义项目【掌握】
5.3.3.1 java项目
步骤一:选择maven project,同上
步骤二:创建一个简单项目(跳过骨架选择)
步骤三:设置项目参数,创建java项目
创建java项目结果
5.3.3.2 web项目
步骤一:同上
步骤二:同上
步骤三:设置项目参数:把packaging 改为war其他同上
创建web项目结果:WEB-INF没有web.xml和index.jsp需手动导入
5.3.3.3 maven项目
项目参数:把packaging 改为porm其他同上
创建结果
maven项目一般没用,在开发中将一个项目拆分成多个项,就需要使用maven项目(pom项目)将其他子项目进行整合。
5.4 myeclipsemaven操作
右键项目选择Run As
6--9 都是快捷方式
9测试
8安装
7关联源码
6清理
5 maven build... 执行maven命令,等效 mvn
4 maven build 5快速的操作
如果没有操作过,与5相同
如果操作一次,将直接执行
如果操作多次,将提供选择框
myeclipse运行web项目
命令Goals: tomcat:run
6.1 仓库
分类:本地仓库、第三方仓库、中央仓库
6.1.1 本地仓库
Maven会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理
通常默认在$user.home/.m2/repository下。
例如:C:\Users\liangtong\.m2\repository
自Maven2以后,构件的存储方式通常是groupId/artifactId/version/*.jar
例如:D:\java\maven\repository\org\springframework\spring-core\3.2.0.RELEASE
修改本地库位置:在$MAVEN_HOME/conf/setting.xml文件的
工程(项目)使用jar包时,优先从本地仓库查询
6.1.2 第三方仓库
第三方仓库,又称为内部中心仓库,也称为私服。
私服:一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。(使用私服为了减少对中央仓库的访问)
私服可以使用的是局域网,中央仓库必须使用外网。
私服一般都是有第三方提供,常见私服服务器: Nexus和Artifactory
私服又可以连接其他公司搭建的私服,例如Jboss中心库、Spring中心库,以随时获得最新版本的第三方构件。
例: 从3.0.2 开始spring提供spring私服(spring中心库),不再提供依赖zip包
注意:连接私服,需要单独配置。如果没有配置私服,默认不使用。
6.1.3 中央仓库
Maven内置了远程公用仓库:http://repo1.maven.org/maven2
这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。目前是以java为主。
工程依赖的jar包如果本地仓库没有,默认从中央仓库下载
6.2 POM全景图(了解)
maven项目都具有pom.xml核心配置文件,POM全景图就是对pom.xml进行整体的描述。
6.2.1 pom关系
1POM Relationships 关系
• Coordinates 坐标:在仓库中唯一标识项目位置三个参数
• 示例:仓库\cn\itcast\maven\demojava\0.0.1-SNAPSHOT
• Aggregation 聚合(多模块): 将项目分解为多个不同模块
模块拆分:crm_staff、crm_classes、crm_coursetype、...等
层次拆分:crm_domain(jar)、crm_dao(jar)、crm_service(jar)、crm_web(war)、crm(pom)等
终端拆分:xxx_web、xxx_wap 等
• Inheritance 继承: 项目之间继承,实现POM复用。在pom项目共享坐标,共享工具等
• dependencyManagement:依赖管理,用于版本锁定
• Dependencies 依赖:一个项目依赖在编译或运行等阶段另一个项目
在maven通过坐标解决依赖关系。
6.2.2 项目信息
2Project Information 项目信息
• name :项目名称
• desciption:项目描述
• url : 访问路径(官方URL)
• inceptionYear : 项目开始时间
• licenses:许可
• developers:开发人员
• contributors:捐赠者
• organization:组织或机构名称
6.2.3 构建设置
Build settings 构建配置
• properties :配置属性。
例如:配置依赖项目版本等
• build :构建项目需要配置。
例如:源码的位置,字节码位置等
• packaging :打包方式
jar java项目压缩包
war web项目压缩包(tomcat可以自动解压)
pom maven项目,用于多个maven项目的继承
ear ejb项目
• reporting :报表
6.2.4 构建环境
Build Environment 构建环境
• environment information 环境信息
issueManagement 问题管理
mailingLists 邮件列表
ciManagement CI管理 (Continuous Integration) 持续集成,自动完成软件代码的编译和测试过程
Hudson是Jenkins的前身,是基于Java开发的一种持续集成工具,用于监控程序重复的工作
scm :供应链管理(Supply chain management ) 一种集成的管理思想和方法
• maven environment maven环境
prerequisites 使用前提
repositories 仓库
pluginsRepositories 插件仓库
distributionManagement 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置(将本地仓库内容 发布到私服)
profiles 配置多个 profile,自定义配置文件,需要激活(activation)
6.2.5 有效POM
有效POM:管理项目时,最终使用的POM
• 包括:超级POM 和 自定义POM
• 超级POM:maven 提供的pom.xml (特定的内容) ,一般内置在maven中。
• 自定义POM:maven项目自己编写的pom.xml
eclipse的 pom.xml打开方式:Open With→Maven POM Editot
6.3 依赖
maven通过坐标描述 项目之间的依赖关系
6.3.1 获得坐标
方式1:使用网站搜索
步骤一:百度搜索关键字“maven repository” 打开网站:•http://mvnrepository.com/
步骤二:输入关键字查询获得需要内容,确定需要版本
http://mvnrepository.com/artifact/org.apache.struts/struts2-core/2.3.15.3
步骤三:获得坐标
org.apache.struts
struts2-core
2.3.15.3
方式2:使用本地仓库,通过myeclipse获得坐标
步骤一:添加依赖,pom.xml文件中,右键
步骤二:获得坐标
6.3.2 依赖(坐标)的常见配置
模板代码
……
……
……
……
……
……
……
……
groupId、artifactId、version是依赖的基本坐标,缺一不可。
type:依赖的类型,
• 默认为jar,表示依赖的jar包。
• 注意:
optional:标记依赖是否可选。默认值false
• A->B->C,那么当A依赖于C时就可以设为可选。
exclusions:排除传递依赖,解决jar冲突问题。
• 例如:spring bean 和 struts2 spring plugin
scope:依赖范围
• compile:编译范围,默认scope,在classpath中存在
• provided:已提供范围,比如容器提供ServletAPI
• runtime:运行时范围,编译不需要,接口与实现分离
• test:测试范围,单元测试环境需要
• system:系统范围,自定义构件,指定systemPath
6.3.2.1 依赖范围:
compile,默认值,表示编译、测试和运行都需要当前jar。
test,表示测试时需要使用当前jar。例如:junit 。此处不写也不报错。
runtime,表示测试和运行时需要当前jar,编译时不用。例如:JDBC驱动。此处不写也不报错。
provided,表示编译和测试时使用当前jar,运行时不使用。例如:servlet-api、jsp-api等。【必须填写】
注意:maven默认不使用任何jar,如果需要必须手动导入所有jar包。
1.开发阶段(myeclipse) -- myeclipse提供需要的jar包
2.运行阶段(tomcat)-- 运行时有tomcat提供
如果使用maven开发,需要手动的导入 servlet和jsp的jar包,此时如果没有设置provided,当前web项目下和tomcat/lib目录下,各有一组jar,在运行时将抛异常。
6.3.2.2 排除依赖(依赖传递)
例如:spring bean 和 struts2 spring plugin
maven默认配置在前面的优先使用
即使struts2-spring-plugin 配置在前面,也需要使用3.2.0版本。需要struts2-spring 排除依赖(不使用3.0.5依赖)
右键-Exclude
注意:查看代码,如果不符合要求,需要手动的修改。(spring自己添加的排除依赖去掉)
org.apache.struts
struts2-spring-plugin
2.3.15.3
spring-core
org.springframework
org.springframework
spring-beans
3.2.0.RELEASE
6.3.3 依赖调节
调解原则:
第一原则:路径近者优先原则
此处路径近,所以X的版本为2.0
第二原则:第一声明者优先原则。如果路径相同,第一个声明的优先。
例子:
A->B->C->D->X(1.6)
A->D-X(2.0)
X是A的传递依赖
1.1.1 创建web项目
1.1.2 导入jar
添加jar依赖
•Spring(context / aspects / orm / test / web)
•Hibernate(core / slf4j / c3p0 / driver / ehcache)
•Struts (core/ spring plugin / json plugin / )
•Web (servle /jsp / jstl / )
•junit
参考《pom_ssh.xml》 整合基本配置
4.0.0
com.itheima.crm
maven_crm
0.0.1-SNAPSHOT
war
maven-compiler-plugin
1.6
org.springframework
spring-context
3.2.0.RELEASE
org.springframework
spring-aspects
3.2.0.RELEASE
org.springframework
spring-orm
3.2.0.RELEASE
org.springframework
spring-test
3.2.0.RELEASE
org.springframework
spring-web
3.2.0.RELEASE
org.hibernate
hibernate-core
3.6.10.Final
org.slf4j
slf4j-log4j12
1.7.2
c3p0
c3p0
0.9.1.2
mysql
mysql-connector-java
5.1.22
runtime
net.sf.ehcache
ehcache
1.5.0
org.apache.struts
struts2-core
2.3.15.3
org.apache.struts
struts2-spring-plugin
2.3.15.3
org.apache.struts
struts2-json-plugin
2.3.15.3
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.1
provided
javax.servlet
jstl
1.2
junit
junit
4.9
test
参数《pom_ssh2.xml》 使用properties 管理 版本
4.0.0
com.itheima.crm
maven_crm
0.0.1-SNAPSHOT
war
maven-compiler-plugin
1.6
3.2.0.RELEASE
3.6.10.Final
org.springframework
spring-context
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework
spring-web
${spring.version}
org.hibernate
hibernate-core
3.6.10.Final
org.slf4j
slf4j-log4j12
1.7.2
c3p0
c3p0
0.9.1.2
mysql
mysql-connector-java
5.1.22
runtime
net.sf.ehcache
ehcache
1.5.0
org.apache.struts
struts2-core
2.3.15.3
org.apache.struts
struts2-spring-plugin
2.3.15.3
org.apache.struts
struts2-json-plugin
2.3.15.3
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.1
provided
javax.servlet
jstl
1.2
junit
junit
4.9
test
*根据maven约定项目结构编写代码
java下不能有配置文件*.hbm.xml应放在resources下
多模块&继承
*多模块
定义一组构建模块的聚集
特点:
•Maven build父模块的时候,会自动build子模块
•父模块的packaging必须为POM
*继承
复用配置
可继承的元素 * 可继承的元素
•groupId, artifactId, version.(groupId/artifactId之一必须重写)
•dependencies* dependencies
plugins
•dependencyManagement
•pluginManagement
•Reporting
•Developers& Contributors
子模块可任意重写父模块配置
一般情况使用maven公司,都会搭建自己的私服。
一般情况目的:使用私服,不需要搭建。
8.4 使用私服
为所有来自中央仓库的构件安装提供本地缓存
下载网站
• http://nexus.sonatype.org/
• 安装版本:nexus-2.7.0-06.war
下载war版本,复制tomcat/webapps安装(tomcat启动自解压war)
启动:bin/startup.bat
启动tomcat,将在c盘创建sonatype-work目录
•win7位置:C:\Users\当前用户\sonatype-work\nexus
8.6 nexus目录结构
位置:C:\Users\Administrator\sonatype-work\nexus
8.6.1 安装目录结构
8.6.2 索引目录结构
8.6.3 存储目录
8.7 nexus配置(无法上网的配置)
将ctx拷贝到C:\Users\Administrator\sonatype-work\nexus\indexer\central-ctx目录
将本地仓库D:\java\maven\repository复制到C:\Users\Administrator\sonatype-work\nexus\storage\central目录
8.8 访问
访问URL
•http://localhost/nexus-2.7.0-06/
默认账号
•用户名: admin
•密码: admin123
8.9 发布到私服(上传)
8.9.1 配置账号和密码
修改settings.xml
releases
admin
admin123
Snapshots
admin
admin123
releases 发布版对应一个URL:http://localhost:8080/nexus-2.7.0-06/content/repositories/releases/
Snapshots 测试版对应一个URL:http://localhost:8080/nexus-2.7.0-06/content/repositories/snapshots/
8.9.2 确定当前项目发布配置信息
修改当前 pom.xml
releases
Internal Releases
http://localhost:8080/nexus-2.7.0-06/content/repositories/releases/
Snapshots
Internal Snapshots
http://localhost:8080/nexus-2.7.0-06/content/repositories/snapshots/
8.9.3 测试发布
deploy 发布
命令:
mvn deploy
8.10 从私服获得内容(下载)
8.10.1 配置镜像
修改settings.xml配置镜像,理解就相当于是过滤器,拦截器原本请求路径
nexus
*
http://localhost:8080/nexus-2.7.0-06/content/groups/public/
public 表示一组私服仓库组合
分别从私服 发布、测试、第三方、中央获取,如果没有在从外网中央获得
8.10.2 配置自定义 profile
nexus
central
http://repo1.maven.org/maven2/
true
true
central
http://repo1.maven.org/maven2/
true
true
8.10.3 激活profile
使用profile需要先在配置中激活
nexus