maven
一、Maven基本介绍
1. 什么是maven
Maven是项目进行模型抽象, 充分运用的面向对象的思想, maven可以通过一小段描述信息来管理项目的构建, 报告和文档的软件项目管理工具。maven除了以程序构建能力为特色之外, 还提供高级项目管理工具。由于maven的缺省规则有较高的可重用性, 所以常常用两三行maven构建脚本就可以构建简单的项目。
2. maven的作用
l 1) maven对项目的第三方构建(jar包)进行统一管理。向工程中加入jar包不要手工从其他地方拷贝, 通过maven定义jar包的坐标,自动从maven仓库中下载到工程中。
l 2) maven提供一套对项目生命周期管理的标准, 开发人员、和测试人员统一使用maven进行项目构建。项目生命周期管理: 编译、测试、打包、部署、运行。
l 3) maven对工程分模块构建,提高开发效率
3. maven的概念模型特点
l 项目对象模型(project object model) :
pom对象模型, 每个maven工程中都有一个pom.xml文件,定义工程所依赖的jar包、本工程的坐标、打包运行方式
l 依赖管理系统(基础核心):
maven通过坐标对项目工程所依赖的jar包统一规范管理
l Maven定义一套项目生命周期:
清理、初始化、编译、测试、报告、打包、部署、站点生成
l 一组标准集合
maven工程有自己标准的工程目录结构、定义坐标有标准
l Maven管理项目生命周期过程都是基于插件完成的
例如: 开发中使用的tomcat插件
jar java rar java工程的压缩包
war web rar web工程的压缩包
4. maven的仓库
l 4.1 maven的仓库分类
仓库名称 |
作用 |
本地仓库 |
相当于缓存, 工程会从远程仓库(互联网)去下载jar包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找 |
中央仓库 |
就是远程仓库, 仓库中jar由专业团队(maven团队)唯一维护。中央仓库的地址: https://mvnrepository.com/ |
远程仓库 |
在公司内部假设一台私服, 其他公司假设一台仓库, 对外公开 |
l 4.2 仓库中存放的内容
- maven 自身运行所需要的插件
- 第三方框架(spring/mybatis/springmvc) 和 工具类的jar包
- 我们自己开发的maven下那个么安装后的jar包
5. maven的坐标
Maven的一个核心的作用就是管理项目的依赖, 引入我们所需的各种jar包等。 为了能自动化的解析任何一个java构件,maven必须将这些jar包或者其他资源进行唯一标识, 这是管理项目的依赖的基础, 也就是我们要说的坐标。 包括我们自己开发的项目,也是要通过坐标进行唯一标识的, 这样才能在其他项目中进行依赖引用。坐标的定义元素如下:
l groupId : 定义当前maven项目名称
l artifactId: 定义项目模块
l version : 定义当前项目的当前版本
例如: 要引入junit的测试jar, 只需要在pom.xml 配置文件中配置引入junit的坐标即可
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
二、Maven的安装(软件)
1. 下载maven
http://maven.apache.org/download.cgi
6. 安装maven
将maven压缩包解压, 复制到没有中文没有空格的目录下,即安装完毕
7. Maven的目录介绍
8. 配置环境变量
MAVEN_HOME=E:apache-maven-3.2.1
Path=%MAVEN_HOME%in;... ...
9. 配置本地仓库
- 找到Maven解压目录confsettings.xml
- 在setting.xml 文件中找到 localRepository 标签
- 将 <localRepository>/path/to/local/repo</localRepository>从注释中取出
- 将标签体内容修改为自定义的Maven仓库目录
l 将 /资料/本仓库/xxx.zip解压
复制 E盘根目录下
l 配置本地仓库
在maven的安装目录中 apache-maven-3.2.1/conf/settings.xml 配置本地仓库:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>E:\Maven_Repository</localRepository>
l 配置阿里云远程仓库(扩展)
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
10. 测试maven安装成功
打开cmd本地控制台, 输入mvn -version
三、IDEA整合本地maven
四、IDEA创建maven工程(重点)
1. 创建空的工程
11. 创建跳过骨架的java项目(重点)
l 2.1: 创建项目
创建后的标准java项目骨架:
l 4.2 创建java代码
package cn.itcast.dao;
public class ProductDao {
public void add() {
System.out.println("--------------------1 ProductDao.add()... ...");
}
public void del() {
System.out.println("--------------------2 ProductDao.del()... ...");
}
public void edit() {
System.out.println("--------------------3 ProductDao.edit().... ...");
}
public void query() {
System.out.println("--------------------4 ProductDao.query()... ...");
}
}
l 4.3 生成测试代码
正式上线前, 每个方法都必须经过测试, 目前我们能够想到的就是main方法.
因为一个类只有一个main方法, 一个类可能有上千个方法, 那得需要多少个方法, 所以 迫切需要更高效方法, junit测试登场了.
为什么junit报红? 因为缺少junit包, 导入缺少的junit包即可
l 4.4 导入依赖
<?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>cn.itcast.maven</groupId>
<artifactId>javase01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--导入junit包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
报红解决:
l 4.5 一个一个测试
完成测试代码:
package cn.itcast.dao;
public class ProductDaoTest {
@org.junit.Test
public void add() throws Exception {
ProductDao productDao = new ProductDao();
productDao.add();
}
@org.junit.Test
public void del() throws Exception {
ProductDao productDao = new ProductDao();
productDao.del();
}
@org.junit.Test
public void edit() throws Exception {
ProductDao productDao = new ProductDao();
productDao.edit();
}
@org.junit.Test
public void query() throws Exception {
ProductDao productDao = new ProductDao();
productDao.query();
}
}
l 4.6
一个一个测试,太累了, 给大家介绍一个简单的.
12. 创建有骨架java工程(了解)
l 3.1 创建工程
l 3.2 java工程目录结构
l 3.3 编写hello world
package cn.itcast;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
总结: 因为创建有骨架的java工程会产生很多多余的配置, 所以实际开发中一般不用.
13. 创建有骨架的web工程(了解)
l 4.1 创建工程
l 4.2 标准web工程目录结构
经过对比发现如下问题:
l 问题一:缺少java目录
更改java目录属性:
l 问题二: 缺少resources目录
l 问题三: 缺少test.java
总结: 使用骨架创建的web项目 在开发时不常用!
理由1: 在pom.xml增加不必要的配置
理由2: 完整的web工程缺的东西太多!
14. 创建跳过骨架的web工程(重点)
l 5.1 创建工程
复制webapp目录到项目2中
修改pom.xml 增加打包方式为war包
l 5.2 配置tomcat插件
因为 web项目最终跑在web服务器中, 所以需要配置 web服务器(tomcat只是其中一个)
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>cn.itcast.maven</groupId>
<artifactId>web02</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
java工程: jar 含义是 java rar
web工程: war 含义是 web rar
-->
<packaging>war</packaging>
<!--配置插件-->
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--配置端口号-->
<port>80</port>
<!--配置项目路径-->
<path>/web02</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
测试:
五、Maven的常用指令
1. clean命令
2. compile命令
15. test 命令
测试命令: 执行 src/test/java 下junit的测试用例
在src/test/java下创建测试类DemoTest
控制台测试结果如下:
16. package命令
mvn package, 打包项目
打包后的项目会在target目录下找到:
17. install命令
mvn install, 打包后将其安装在本地仓库
安装完毕后,可以在本地仓库中找到 对应的项目:
六、依赖管理
1. maven插件
maven是一个核心引擎, 提供了基本的项目处理能力和建设过程的管理, 以及一系列的插件是用来执行实际建设任务。maven插件可以完成一些特点的功能。例如, 集成jdk插件可以方便的修改项目的编译环境; 集成tomcat插件后, 无需安装tomcat服务器就可以运行tomcat进行项目的发布与测试, 在pom.xml中通过plugin标签引入maven的功能插件
l 1. jdk编译版本的插件
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>cn.itcast</groupId>
<artifactId>maven_javaweb02</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
l 2. tomcat7服务端的插件
配置tomcat插件
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/aaa</path>
<port>8888</port>
</configuration>
</plugin>
运行tomcat插件
tomcat 插件注意问题
Maven的中央仓库中只有tomcat7.X版本
如果想使用tomcat8.X版本,
1. 需要从第三方仓库查找
2. 或者使用idea集成外部的tomcat插件
l 3 扩展插件: IDEA的lombok插件
步骤一: 安装lombok插件,重启idea
步骤二 : pom.xml到如lombok的jar包
步骤三: 编写POJO类 ,使用lombok提供的注解,代替 set get toString方法
package com.itheim.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 目的: 使用lombok 插件提供的注解,给该类提供 set方法 get方法 toString方法
* 编写测试
*
* 实现步骤:
* 1.安装lombok插件,重启idea
* 2.pom.xml到如lombok的jar包 (如果本地仓库有该jar ,自动提示补全,如果没有?)
* 3.在Person类上添加一个@Data注解 ( set方法 get方法 toString方法)
* 4.编写测试类,使用以上提供的方法,打印查看
*/
@Data //set方法 get方法 toString方法 没有全餐构造
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private int age;
private String sex;
}
步骤四: 测试lombok的使用
package com.itheim.pojo;
import org.junit.Test;
public class PersonTest {
@Test
public void testPerson(){
Person p = new Person();
p.setName("柳岩");
p.setAge(18);
p.setSex("女");
System.out.println(p.getName());
System.out.println(p);
}
}
2. 导入依赖
l 1. 导入junit依赖
导入junit坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
进行单元测试
import org.junit.Test;
public class DemoTest {
@Test
public void demo1() {
System.out.println("敢于亮剑,绝不后退!");
}
}
3.依赖范围
l compile: 编译、测试、运行, A在编译时依赖B, 并且在测试和运行时也依赖
例如: strus-core、 spring-beans 。 打到war包或jar包
l Provided: 编译、和测试有效, A在编译和测试时需要B
例如: 如果某些包在运行的时候, 所对应的容器内已经有这个jar包, 此时就不需要在将包打入, 只需要让其在编译和测试中有效即可
l runtime: 测试、运行有效
例如: jdbc驱动包, 在开发代码中针对java接口开发, 编译不用 , 在运行和测试时, 需要通过jdbc驱动包(mysql) 连接数据库, 需要时会打入war
l test: 只是测试有效, 只在单元测试类中用
例如: junit 只需要测试用即可, 不会打到war包
按照依赖强度, 由强到弱来排序:
compile > provided > runtime >test
七、聚合工程
项目开发通常是分组分模块开发, 每个模块开发完成后, 要运行整个工程需要将每个模块聚合在一起运行, 此时需要多个工程合并在一个大的工程中,我们将这样的工程称为聚合工程
在父工程, 主要是可以对多个子工程进行管理: 比如 锁定jar包的版本,定义一些公共的插件(jdk的编译插件)等
在子工程中 可以根据自己的业务需要, 使用对应的jar包, 如果在父工程中定义了对应jar包的版本后, 子工程此时不需要指定jar包版本, 同时如果父工程已经定义了相关的插件, 子工程也无需定义
接下来, 尝试定义一个聚合工程, 演示响应的内容:
l 1) 创建父工程项目
注意: 父工程 仅仅是对jar包和插件的管理操作, 没有任何业务代码, 顾不需要src
l 2) 创建子工程
l 3) 依次来构建另外两个子工程即可
最终效果:
l 4) 三个子工程建立依赖关系
l 5) 此时在父工程中添加一个jdk的编译插件
首先我们先看没有添加版本插件之前, 整个maven工程的默认编译版本
在bigdata18_parent的pom文件添加一个jdk的编译插件
此时在观察所有maven项目的版本:
发现都变成了1.8. 说明在父工程添加插件, 子工程都会继承
其实:同样在父工程里面添加jar包, 子工程也会进行继承的
l 6) 版本锁定: 在父工程 对jar包的版本进行锁定
<dependencyManagement>锁定版本, 此时在父工程中并不会真正的将这个jar包导入
我们现在在任意子工程中进行导入junit的jar包: