Maven整理
简介
Maven是一个管理工程的工具,它实现了项目构建,Jar包的管理,工程之间依赖的管理以及自动打包。
Maven可以实现让项目与依赖的jar包实现分离,他会把jar包保存在本地仓库(就是放JAR的地方),当使用的时候,通过坐标来获取(jar包管理),第一次接触可能会问,把需要的jar包拷贝到lib目录下跟放在本地仓库有什么不一样吗,这也很好说明,如果使用传统方式,当你开发完一个项目,再开发另一个项目,他们所需要相同jar包的时候,你又得再拷贝一份,虽然不是特别麻烦,但项目构建多了对硬盘内存也是一种浪费,但使用maven就可以完全避免这个问题。
绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。 构建工程师和项目经理会说 Maven是一个更复杂的东西:一个项目管理工具。那么区别是什么? 像Ant这样的构建 工具仅仅是关注预处理,编译,打包,测试和分发。像 Maven 这样的一个项目管理工 具提供了构建工具所提供功能的超集。 除了提供构建的功能,Maven还可以生成报告, 生成Web站点,并且帮助推动工作团 队成员间的交流。一个更正式的 Apache Maven 1 的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。别让Maven是一个"项目管理"工具的事实吓跑你。如果你只是在找一个构建工具,Maven能做这个工作。 事实上,本书的一些章节将会涉及使用Maven来构建和分发你的项目。
大家会发现,在平时项目中,我们每天有相当一部分时间花在了编译、运行单元测试、生成文档、打包和部署等烦琐且不起眼的工作上,如果你使用Ant,会发现很多东西都要程序员去定义,去编写build文件,然而有了Maven这个构建工具,能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍又一遍地输入命令,一次又一次地点击鼠标,或者小心翼翼的写着配置文件,我们要做的是使用Maven配置好项目,然后输入简单的命令(如mvn clean install),Maven会帮我们处理那些烦琐的任务。这一切都体现了一句经典“约定优于配置”,当然Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具,况且Maven也是跨平台的。这些都会通过实例说明。
Maven项目的目录结构
Maven构建生命周期及命令
验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
编译 compile 执行编译 源代码编译在此阶段完成
测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
clean:把target目录删除,相当于把编译的.class文件全部删掉
为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。
Maven 有以下三个标准的生命周期:
clean:项目清理的处理
default(或 build):项目部署的处理
site:项目站点文档创建的处理
常用命令
compile:建立target目录,相当于编译,创建.class文件
install:把项目打成jar包或者war包,安装到本地repository
package:把项目打成jar包或者war包,到target目录
test:运行工程的测试
Scope(作用域)
compile:默认作用域,在编译、测试、运行时有效
test:对于测试时有效
runtime:对于测试、运行时有效
provided:对于编译、测试时有效,但在运行时无效
system:与 provided 类似,但依赖于系统资源
锁定版本
<!-- 属性: 定义版本的常量,方便修改 -->
9 <properties>
10 <!-- 名称是任意的,建议使用有意义的名字 -->
11 <spring.version>4.2.4.RELEASE</spring.version>
12 <hibernate.version>5.0.7.Final</hibernate.version>
13 <struts.version>2.3.24</struts.version>
14 </properties>
15
16 <!-- 锁定版本: struts2-2.3.24, spring4.2.4, hibernate5.0.7 -->
17 <dependencyManagement>
18 <dependencies>
19 <dependency>
20 <groupId>org.springframework</groupId>
21 <artifactId>spring-context</artifactId>
22 <!-- OGNL 表达式 -->
23 <version>${spring.version}</version>
24 </dependency>
25 <dependency>
26 <groupId>org.springframework</groupId>
27 <artifactId>spring-aspects</artifactId>
28 <version>${spring.version}</version>
29 </dependency>
30 <dependency>
31 <groupId>org.springframework</groupId>
32 <artifactId>spring-orm</artifactId>
33 <version>${spring.version}</version>
34 </dependency>
35 <dependency>
36 <groupId>org.springframework</groupId>
37 <artifactId>spring-test</artifactId>
38 <version>${spring.version}</version>
39 </dependency>
40 <dependency>
41 <groupId>org.springframework</groupId>
42 <artifactId>spring-web</artifactId>
43 <version>${spring.version}</version>
44 </dependency>
45 <dependency>
46 <groupId>org.hibernate</groupId>
47 <artifactId>hibernate-core</artifactId>
48 <version>${hibernate.version}</version>
49 </dependency>
50 <dependency>
51 <groupId>org.apache.struts</groupId>
52 <artifactId>struts2-core</artifactId>
53 <version>${struts.version}</version>
54 </dependency>
55 <dependency>
56 <groupId>org.apache.struts</groupId>
57 <artifactId>struts2-spring-plugin</artifactId>
58 <version>${struts.version}</version>
59 </dependency>
60 </dependencies>
61 </dependencyManagement>
设置JDK版本
<!-- 设置JDK 版本 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
POM文件属性和说明
Maven依赖传递
1.什么是传递依赖?
依赖一个jar包往往会下载相互关联的jar包这就是依赖传递
2.依赖传递出现的问题
依赖传递出现的问题: 经常出现jar包冲突,
解决方案:直接排除指定的jar包
3.解决jar包冲突的方式(4种)
3.1 排除原则(常用)
3.2 版本号限定原则
3.3 第一声明原则(基本不用)
3.4 路径就近原则(基本不用)
4 依赖传递中的依赖范围
Maven继承
开发中多个项目有共同的jar包依赖,可以采用继承方式简化各个项目的pom文件,在父类的pom文件中依赖共同拥有的jar.
注意:
1.父级项目只能是pom打包方式。
2.子项目是一个Maven Project
示例: 创建一个pom项目,然后再创建另外的jar或war项目继承pom项目
Maven聚合和拆分
maven_parent下pom.xml文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qjb</groupId>
<artifactId>maven_parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>maven_dao</module>
<module>maven_service</module>
<module>maven_web</module>
</modules>
</project>
模块maven_service如果要使用maven_dao,则需要建立依赖:
模块maven_web也可这样于maven_service建立依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>maven_parent</artifactId>
<groupId>com.qjb</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven_service</artifactId>
<dependencies>
<dependency>
<groupId>com.qjb</groupId>
<artifactId>maven_dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
能够把项目的各个模块聚合在一起构建。一般用于分模块开发,最后整体打包发布。
Maven Model和Maven Project的区别?
Maven Project独立运行
Maven Model无法独立运行
注意:
1.根项目是一个pom项目。
2.子模块:Maven Model
3.每个模块写完后需要上传到私服
4.打包,需要整体打包找到最后的war项目使用Tomcat加载
实际中,我们会将一些庞大的项目拆分为若干模块进行开发
三层+MVC 如下:
model-------jar
dao----------jar
service------jar
web----------war
Maven父子工程三种启动方式
1、maven_parent通过maven命令使用内置tomcat启动
2、使用install命令将maven_parent项目打包并放置到本地仓库中,maven_web通过maven命令使用内置tomcat启动
3、使用本地tomcat启动