Java笔记-maven使用全解
楔子
通常web项目开发只会创建一个工程,然后把所有的jar包都存放到WEB-INF/lib目录下,如下图所示:
这样的添加方式太麻烦,需要一个项目管理和综合工具来管理这些jar包,所以引入了Maven,美文。
它的特点是:
(1)依赖管理工具:当前的软件开发依赖太复杂,需要导入的jar包数量庞大且互相之间的依赖关系非常复杂。
(2)构建管理工具:构建是个复杂的过程,编译将源程序编译成java字节码,打包成war包,之后部署到服务器上,这是构建的操作。当服务器端部署时,需要maven帮忙构建。
Maven主要目标是提供开发人员
①、项目是可重复使用,易维护,更容易理解的一个综合模型。
②、插件或交互的工具,这种声明性的模式。
Maven项目的结构和内容是在一个XML文件中声明,pom.xml的项目对象模型(POM),这是整个Maven系统的基本单元
1.0 Maven的工作机制
maven依赖的jar包分为三类:(1)自己的jar包 (2)第三方的jar包 (3)maven插件的jar包
1.1 新建一个maven工程
Maven工程的结构:
工程包括如下:
1.2 配置xml文件
pom: project object model 项目对象模型
pom.xml是Maven的核心配置文件
一个Maven项目有且只有一个pom.xml文件,该文件必须在项目的根目录下
下面将逐项说明:
(1)XML版本:
- <?xml ?>:报文头格式,报文头内容放在xml和?符号中间
- version="1.0":声明使用的xml版本
- encoding="utf-8":声明用xml传输数据时候用的字符编码(字符集)
<?xml version="1.0" encoding="UTF-8"?>
(2)根标签project-项目/工程,对当前工程进行配置管理
xmlns(XML Namespaces的缩写)是一个属性,是XML( 标准通用标记语言 的子集)命名空间。作用是赋予 命名空间 一个唯一的 名称 。
xsi全名:xml schema instance
web-app是web.xml的根节点标签名称
version是版本的意思
xmlns是web.xml文件用到的命名空间。xmlns表示默认的Namespace。
xmlns:xsi是指web.xml遵守xml规范。也就是说xsi=" http://www. w3.org/2001/XMLSchema-i nstance 这个文件里面定义的元素应该遵守什么规范。表示使用xsi作为前缀的Namespace,当然前缀xsi需要在文档中声明。
xsi:schemaLocation是指具体用到的schema资源。指定名称空间所对应的XML Schema文档的存储位置,它通常包含两部分,一部分是名称空间(nameSpace)的URI,一部分是该名称空间所标识的XML Schema文件位置。
<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">
</project>
(3)modelVersion 标签:从Maven 2 开始就固定是4.0.0。它也是代表pom.xml所采用的标签结构。
<modelVersion>4.0.0</modelVersion>
(4)maven的坐标
groupId: 坐标向量之一,代表公司或组织开发的某一个项目
artifactId:坐标向量之一,代表项目下的某一个模块
version:坐标向量之一,代表当前模块得到版本
<groupId>com.zengkeke.sample_project</groupId>
<artifactId>sample_project</artifactId>
<version>1.0-SNAPSHOT</version>
(5)packaging 打包方式, 默认生成jar包,说明这是一个java工程;如果取值是war,那么就会打war包,说明这是一个web工程。取值pom,说明这个工程是用来管理其他工程的工程 。
<packaging>jar</packaging>
(6)name和url
name:当前工程名字
url:maven的官网地址
<name>sample_project</name>
<url>http://maven.apache.org</url>
(7)properties标签,在Maven中定义属性值,compiler是设置编译环境,Java版本号。在maven3之后,除非在POM文件中显示的指定一个版本,否则会使用编译器默认的source/target。source用来配置源代码使用的开发版本,target用来配置需要生成的目标class文件的编译版本,那么有些朋友可能会问为什么 maven 编译不使用class将来被部署的环境的jdk版本:有时可能会因maven版本需求或者其他一些插件需求,这些限制规定了我们必须在编译机器上使用比如说jdk7及其以上的版本,但是我们运行的环境使用的是jdk6,这时候就需要增加一个source参数来解决这个问题。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
(8)dependencies标签,配置依赖信息,我们通过dependencies来配置,用dependency标签来配置具体的依赖信息,通过使用坐标来指定它。
以junit测试包为例,scope是范围,junit3不支持注解
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
1.3 pom的核心概念
1.3.1 含义
POM:Project Object Model,项目对象模型。和POM类似的是:DOM,文档对象模型,它们都是模型化思想的具体体现。
1.3.2 模型化思想
POM表示将工程抽象为一个模型,再用程序中的对象来描述这个模型,这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。
1.3.3 对应的配置文件
POM理念集中体现在Maven工程目录下pom.xml这个配置文件中,所以这个pom.xml配置文件就是Maven工程的核心配置文件,其实学习Maven就是学这个文件怎么配置,各个配置有什么用。对于web应用来说,web.xml是配置文件。
1.4 Maven核心概念:约定的目录结构
1.4.1 各个目录的作用
这个目录结构,其实是超级POM中定义好的,所以每个具体的POM中,无需配置。超级POM是所有POM的父POM。
1.4.2 约定目录结构的意义
Maven为了让构建过程能够自动化完成,所以必须约定目录结构的作用。例如:Maven执行编译操作,必须先去Java源程序目录读取Java源代码,然后执行编译,最后把编译结果存放在target目录中。
1.4.3 约定大于配置
Maven对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便,如果每次创建Maven工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。
目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码。约定是默认的配置,是开发者之间的协议。
2.1 在Maven工程中编写代码
2.1.1 主体程序
主体程序是指被测试的程序,同时也是将来在项目中真正要使用的程序。
package com.zengkeke.maven;
public class Calculator {
public int sum(int i, int j){
return i + j;
}
2.1.2 测试程序:
package com.zengkeke.maven;
import org.junit.Test;
import com.zengkeke.maven.Calculator;
// 静态导入的效果是将Assert类中的静态资源导入当前类
// 这样一来,在当前类中就可以直接使用Assert类中的静态资源,不需要写类名
import static org.junit.Assert.*;
public class CalculatorTest {
@Test
public void testSum(){
// 1.创建Calculator对象
Calculator calculator = new Calculator();
// 2.调用Calculator对象的方法,获取到程序运行实际的结果
int actualResult = calculator.sum(5, 3);
// 3.声明一个变量,表示程序运行期待的结果
int expectedResult = 8;
// 4.使用断言来判断实际结果和期待结果是否一致
// 如果一致:测试通过,不会抛出异常