Maven 基础
Maven的Apache公司开源项目,是项目构建工具。用来依赖管理
1 maven的好处
使用传统项目开发crm项目,项目大小:
同样的项目使用maven开发
同样的代码,实现功能都一样,maven项目如何做到的?可以初步推断maven项目中一定没有jar包。没有jar包的maven项目如何运行?Maven项目找jar包过程
2 maven的好处如何实现
maven的两大核心:
**依赖管理:对jar包管理过程
**项目构建:项目在编码完成后,对项目进行编译、测试、打包、部署等一系列的操作都通过命令来实现
通过maven命令将web项目发布到tomcat:
3 maven安装、配置本地仓库
maven程序安装前提:maven程序java开发,它的运行依赖jdk。
3.1 maven的下载安装
1、找到资料
下载地址:http://maven.apache.org/download.cgi
2、解压到本地磁盘(解压目录不要有中文,空格)
3、配置环境变量
Jdk环境变量:JAVA_HOME
将maven_home环境变量配置到path环境变量中
查询maven的版本信息:
3.2 配置本地仓库
仓库类型
配置本地仓库:
1、 找到jar包仓库压缩包
2、 解压到本地磁盘
3、 配置本地仓库:让maven程序知道仓库在哪
4 maven项目标准目录结构(记忆)
5 maven的常用命令(应用)
5.1 clean:清理
将项目根目录下target目录清理掉。
5.2 compile:编译
将项目中.java文件编译为.class文件
5.3 test:单元测试
单元测试类名有要求:XxxxTest.java
将项目根目录下src/test/java目录下的单元测试类都会执行。
5.4 package:打包
web project ---- war包
java project -----jar包
将项目打包,打包项目根目录下taget目录
5.5 install:安装
解决本地多个项目公用一个jar包。
打包到本地仓库
5.6 maven项目的生命周期(了解)
在maven中存在“三套”生命周期,每一套生命周期相互独立,互不影响。在一套生命周期内,执行后面的命令前面操作会自动执行
CleanLifeCycle:清理生命周期
Clean
defaultLifeCycle:默认生命周期
compile,test,package,install,deploy
siteLifeCycle:站点生命周期
site
5.7 概念模型
两个核心:
**依赖管理:对jar包管理
**项目构建:通过命令进行项目构建
6 maven整合web项目案例
6.1 配置eclipse中maven环境
1、 配置m2e插件,Mars2版本自带maven插件
2、 需要配置maven程序
3、 配置userSetting:让eclipse知道maven仓库位置
4、 构建索引
6.2 Maven整合servlet
创建好的web项目,错误:
1、 web.xml缺失
2、 jdk编译版本1.5,在pom.xml中添加插件
3、 创建servlet,serlvet编译报错,原因:缺失servlet-api-xx.jar包
6.2.1 查找依赖
注意:选择依赖选择[jar]
6.3 依赖范围(了解)
添加依赖范围:默认是compile
Provided: 运行部署到tomcat不在需要
如果将servlet-api.jar设置为compile,打包后包含serlvet-api.jar,war包部署到tomcat跟tomcat中存在servlet-api.jar包冲突。导致运行失败。
总结:如果使用到tomcat自带jar包,将项目中依赖作用范围设置为:provided,其他可以默认
scope的分类
compile(编译范围)
默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,
运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
test(测试范围)
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。
runntime(运行时范围)
runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,
说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,
具体实现是runtime的,compile只需要知道接口就足够了。Oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。
另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。
provided(已提供范围)
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;
这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。
system(系统范围)
system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,
而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,
你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。
scope的依赖传递
A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?答案是:
当C是test或者provided时,C直接被丢弃,A不依赖C;
否则A依赖C,C的scope继承于B的scope。
下面是一张nexus画的图。
6.4 运行项目
但是如果debug调试需要先添加原码
6.5 Maven整合struts2
1、通过工具生成web.xml
2、添加struts2的依赖
3、创建struts.xml
4、创建action类
5、在web.xml中配置struts2框架核心过滤器
5、 编写action中方法
6、 在struts.xml中配置
7 总结
- 1、 安装
- 2、 Maven标准的目录结构
ProjectName
src
main
java
resources
[webapp/WEB-INF/web.xml]
Test
Java
Resources
pom.xml - 3、 Maven常用命令
a) Clean
b) Compile
c) Test
d) Package:项目根目录target目录
e) Install:本地仓库 - 4、 使用eclipse开发maven项目
a) 区别:
b) 不在拷贝jar包
c) 项目目录结构不同 - 5、 Pom.xml:项目对象模型
a) 本项目的坐标信息
b) 本项目jdk编译版本的信息
c) 本项目需要的依赖的坐标的信息