Maven 基础

Maven的Apache公司开源项目,是项目构建工具。用来依赖管理

1 maven的好处

使用传统项目开发crm项目,项目大小:

Maven 小锤子 maven小黑_maven


同样的项目使用maven开发

Maven 小锤子 maven小黑_Maven 小锤子_02


同样的代码,实现功能都一样,maven项目如何做到的?可以初步推断maven项目中一定没有jar包。没有jar包的maven项目如何运行?Maven项目找jar包过程

Maven 小锤子 maven小黑_maven_03

2 maven的好处如何实现

maven的两大核心:
**依赖管理:对jar包管理过程
**项目构建:项目在编码完成后,对项目进行编译、测试、打包、部署等一系列的操作都通过命令来实现

通过maven命令将web项目发布到tomcat:

Maven 小锤子 maven小黑_maven_04

3 maven安装、配置本地仓库

maven程序安装前提:maven程序java开发,它的运行依赖jdk。

3.1 maven的下载安装

1、找到资料

下载地址:http://maven.apache.org/download.cgi

2、解压到本地磁盘(解压目录不要有中文,空格)

3、配置环境变量

Jdk环境变量:JAVA_HOME

Maven 小锤子 maven小黑_Maven 小锤子_05


Maven 小锤子 maven小黑_maven_06


将maven_home环境变量配置到path环境变量中

查询maven的版本信息:

Maven 小锤子 maven小黑_xml_07

3.2 配置本地仓库

仓库类型

Maven 小锤子 maven小黑_Maven 小锤子_08


配置本地仓库:

1、 找到jar包仓库压缩包

2、 解压到本地磁盘

3、 配置本地仓库:让maven程序知道仓库在哪

Maven 小锤子 maven小黑_Maven 小锤子_09

4 maven项目标准目录结构(记忆)

Maven 小锤子 maven小黑_xml_10


Maven 小锤子 maven小黑_jar包_11

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包管理
**项目构建:通过命令进行项目构建

Maven 小锤子 maven小黑_maven_12

6 maven整合web项目案例

6.1 配置eclipse中maven环境

1、 配置m2e插件,Mars2版本自带maven插件

2、 需要配置maven程序

Maven 小锤子 maven小黑_jar包_13


3、 配置userSetting:让eclipse知道maven仓库位置

Maven 小锤子 maven小黑_jar包_14


4、 构建索引

Maven 小锤子 maven小黑_xml_15

6.2 Maven整合servlet

Maven 小锤子 maven小黑_jar包_16


Maven 小锤子 maven小黑_Maven 小锤子_17


Maven 小锤子 maven小黑_jar包_18


创建好的web项目,错误:

1、 web.xml缺失

Maven 小锤子 maven小黑_xml_19


2、 jdk编译版本1.5,在pom.xml中添加插件

Maven 小锤子 maven小黑_maven_20


3、 创建servlet,serlvet编译报错,原因:缺失servlet-api-xx.jar包

Maven 小锤子 maven小黑_jar包_21

6.2.1 查找依赖

注意:选择依赖选择[jar]

Maven 小锤子 maven小黑_Maven 小锤子_22

6.3 依赖范围(了解)

添加依赖范围:默认是compile

Provided: 运行部署到tomcat不在需要

如果将servlet-api.jar设置为compile,打包后包含serlvet-api.jar,war包部署到tomcat跟tomcat中存在servlet-api.jar包冲突。导致运行失败。

Maven 小锤子 maven小黑_maven_23


Maven 小锤子 maven小黑_maven_24


Maven 小锤子 maven小黑_maven_25


总结:如果使用到tomcat自带jar包,将项目中依赖作用范围设置为:provided,其他可以默认

Maven 小锤子 maven小黑_maven_26

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画的图。

Maven 小锤子 maven小黑_jar包_27

6.4 运行项目

Maven 小锤子 maven小黑_jar包_28


但是如果debug调试需要先添加原码

Maven 小锤子 maven小黑_xml_29

6.5 Maven整合struts2

1、通过工具生成web.xml

Maven 小锤子 maven小黑_Maven 小锤子_30


Maven 小锤子 maven小黑_maven_31


2、添加struts2的依赖

3、创建struts.xml

4、创建action类

5、在web.xml中配置struts2框架核心过滤器

Maven 小锤子 maven小黑_xml_32


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) 本项目需要的依赖的坐标的信息