文章目录
1.Maven工程约定目录结构
这个约定是大家都遵循的规则,每一个maven项目在一个磁盘中都是一个文件夹。例如Hello的目录结构:
Hello/
/src
/main #放主程序
/java #放程序包和包中的java文件
/resources #放java程序要使用的配置文件
/test #放测试程序代码和文件的,不严格要求的话,可以没有
/java #测试的程序包和包中的java文件
/resources #测试java程序中要使用的配置文件
/pom.xml #maven的核心文件
简单创建一个Hello的Maven程序
按照上面的目录结构创建
然后在/src/main/java里创建一个com目录,里面创建一个HelloMaven.java文件,代码如下
package com;
public class HelloMaven {
public int add(int a, int b){
return a+b;
}
public static void main(String[] args) {
HelloMaven hello = new HelloMaven();
System.out.println("10+20="+hello.add(10,20));
}
}
在/Hello目录下执行命令编译
mvn compile 编译src/main目录下的所有java文件,第一次执行会下载编译所需要的依赖
https://repo.maven.apache.org:中央仓库地址
- (1)为什么要下载?
maven工具执行的操作需要很多插件(java类–形式是jar文件)完成的
- (2)下载什么东西了?
下载了jar文件(插件),是用来完成某些功能的
- (3)下载到哪里去了?
默认放在默认仓库(本机仓库):C:\Users\shinle(这个是电脑的用户名).m2\repository
这个可以改,修改本机存放资源的目录位置(设置本机仓库):
修改maven的配置文件,maven安装目录/conf/setting.xml,修改把这个标签移到注释外面,然后改你指定的路径(不要有中文路径)即可
mvn compile执行完的结果是在项目的根目录下生成一个target目录(称为结果目录),最后的编译的class文件都放在target里。
在这个目录下执行java命令运行
2.仓库
(1)仓库:仓库是存放东西的,存放maven使用的jar和我们项目使用的jar,存放一些资源
(2)仓库的分类
-
本地仓库:就是上面的本机仓库C:\Users\shinle(这个是电脑的用户名).m2\repository
-
远程仓库:在互联网的,使用网络才能使用的仓库。
- 中央仓库:最权威的,所有开发人员都共享使用的一个集中的仓库https://repo.maven.apache.org,放在欧洲的一个服务器上。
- 中央仓库的镜像:都放在一个服务器,这个服务器的压力会比较大,所以有镜像,就是相当于中央仓库的备份,在各大洲、重要城市都有镜像。
- 私服:在公司的内部,在局域网中使用,不是对外使用的。
(3)仓库的使用:maven仓库的使用不需要人为参与。
开发人员用到的资源 --> maven首先查本地仓库 --查不到--> 查私服 --查不到--> 查镜像 --查不到--> 查中央仓库
3.pom文件
pom:是maven的核心,叫做项目对象模型。
- 基本信息
属性 | 基本描述 |
---|---|
modelVersion | Maven模型的版本,对于Maven2和Maven3来说,它只能设置为 4.0.0。 |
groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。格式可以为:1.域名倒写。例如 com.baidu;2.域名倒写+项目名。例如:com.baidu.项目名 |
artifactId | 这是工程的标识。它通常是工程的名称。也是模块的名称,对应groupId中项目的子项目 |
version | 这是工程的版本号。version使用三位数字标识,例如1.0.0。如果项目还在开发中,是不稳定的版本,通常会在版本后带-SNAPSHOT。例如1.0-SNAPSHOT |
packing | 项目打包的类型,可以使jar、war、rar、ear、pom,默认是jar |
- 依赖
属性 | 基本描述 |
---|---|
dependencies 和 dependency | 叫做依赖,指在项目中用到的各种资源说明 |
- 配置属性
属性 | 基本描述 |
---|---|
properties | 用来定义一些配置属性的,例如设置项目构建源码的编码方式等等 |
- 构建
属性 | 基本描述 |
---|---|
build | 表示与构建相关的配置,例如设置编译插件的jdk版本等 |
- 继承
属性 | 基本描述 |
---|---|
parent | 声明要继承的父工程的pom配置,类似于java的继承机制 |
- 聚合
属性 | 基本描述 |
---|---|
modules | 提供一个额外的模块,打包方式为pom,使用modules聚合其他模块,使本模块可以一键自动识别模块间的依赖关系来构建所有的模块。 |
4.生命周期
maven工具构建项目的过程(清理、编译、测试、报告、打包、安装、部署),就是生命周期
5.Maven常用命令
Maven对所有的功能都提供相应的命令,通过命令完成maven生命周期的执行。
- mvn clean:清理(会删除原来的编译和测试的目录,即target目录。)
- mvn compile:编译主程序(会在当前目录生成一个target目录,存放编译程序的字节码文件)
- mvn test-compile:编译测试程序(会在当前目录生成一个target目录,存放编译测试程序的字节码文件)
- mvn test:测试(会生成一个目录surefire-reports,保存测试结果)
- mvn package:打包主程序
- mvn install:安装主程序(按照本工程坐标保存带本地仓库中)
- mvn deploy:部署主程序(会保存到私服仓库中,还会自动把项目部署到web容器中),这个一般不用它,因为涉及到服务器的一些配置,一般是人工部署。
注意:以上命令必须进入pom.xml所在目录下,并且执行每个步骤,都会把前面的步骤都执行了,哪一个步骤出错,后面就执行不了!
单元测试
单元测试(测试方法):用得是junit,是一个专门测试的框架(工具)
junit测试的内容:测试的是类中的方法,方法是测试的基本单元(单位)。
maven可以借助单元测试,批量测试类中大量的方法是否符合预期
使用步骤
- 1.添加依赖,在pom.xml中加入依赖,例如
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
- 2.在maven项目中/src/test/java目录下,插件测试程序
- 测试类的名称,通常为 Test + 测试的类名
- 测试的方法名,通常为Test + 测试方法名
其中测试方法定义规则:- 1.方法必须是public
- 2.方法必须没有返回值
- 3.方法名称自定义,但推荐Test + 测试方法名
- 4.想要有注解 @Test
例如测试HelloMaven
- 添加junit依赖
- 创建测试类 TestHelloMaven
- 在类里创建测试方法
package com;
import org.junit.Assert;
import org.junit.Test;
public class TestHelloMaven{
@Test
public void TestAdd(){
HelloMaven hello = new HelloMaven();
int res = hello.add(10,20);
//验证,使用junit提供的方法,对比结果
//assertEquals(期望值,实际值),相等证明正确,不等就抛异常,
Assert.assertEquals(30,res);
}
}
执行mvn test命令
测试成功
7.插件
maven插件:maven命令执行时,真正完成功能的是插件,插件就是一些jar文件,一些类。
常用的插件:
<!--控制配置Maven构建项目的参数配置-->
<build>
<!--配置插件-->
<plugins>
<!--配置具体的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<!--插件的名称-->
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<!--配置插件信息-->
<cofiguration>
<!--告诉maven我们的代码是在jdk1.8上编译的-->
<source>1.8</source>
<!--我们的程序应该运行在1.8的jdk环境上-->
<target>1.8</target>
</cofiguration>
</plugin>
</plugins>
<build>
8.坐标
groupId、artifactId、version三个元素生成了一个Maven项目的基本坐标,在众多的maven项目中可以唯一定位到某个项目。坐标也决定着将来项目在仓库中的路径和名称。
依赖
要用到的各种资源都在中央仓库:https://mvnrepository.com/,以groupId或者artifactId作为搜索条件。
9.依赖
一个Maven项目正常运行需要其他项目支持,Maven会根据坐标自动到本地仓库中查找。如果本地仓库没有,会到远程仓库寻找
依赖范围,使用的scope表示的。
scope的值有compile(所有阶段)、test(测试阶段)、provided(提供者:编译和测试),默认是compile
表示依赖在哪个构建项目的阶段起作用
compile | test | provided | |
---|---|---|---|
对主程序是否有效 | 是 | 否 | 是 |
对测试程序是否有效 | 是 | 否 | 是 |
是否参与打包 | 是 | 否 | 否 |
是否参与部署 | 是 | 否 | 否 |
<!--dependencies表示依赖有很多个,以后添加依赖就直接在这里面加就行了-->
<dependencies>
<!--依赖 相当于java中的import-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>