Maven学习笔记
文章目录
Chapter 2 Maven核心概念
2.1 Maven工程约定目录结构
Maven中的目录结构不是任意的,而是约定好的。maven中约定的目录结构:
每一个maven的项目在磁盘中都是一个文件
MyProject
|----src
|----|----main #放你主程序java代码和配置文件
|----|----|----java #程序包和包中的java文件
|----|----|----recource #你的java程序中要使用的配置文件
|----test #放测试程序代码和文件的(可以没有)
|----|----main #测试程序包和包中的java文件
|----|----resource #测试java程序中要用的配置文件
|----pom.xml #maven的核心文件(maven项目必须有)
疑问:mvn compile 编译src/main目录下的所有java文件
(1)为什么要下载
maven工具执行的操作是需要很多的插件(java类—jar文件)去完成的
(2)下载什么?
jar文件–插件–插件是完成某些功能的
(3)下载的东西存放到哪?
默认仓库:
C:\Users\(登录操作系统的用户名)Administrator\.m2\repository
执行mvn compile,结果是在项目的根目录下形成一个target目录。项目编译的
2.1.1 样例测试
为了验证Maven的目录结构,我们做这样的一个实验:
-
首先在一个文件下建立一个目录结构:
-
注意的是src下还要有一个pom.xml文件。pom.xml文件已经提供:
链接:https://pan.baidu.com/s/1RmEXwjAiB3tuejyGWR0drg
提取码:0uy7将pom.xml文件复制到src的同级目录下即可:
在这之后我们在src-main-java下编写一个java文件:
这个文件的内容随意,是一个正确的java代码就行。这里提供一个可用于该步骤测试的代码:
package syq.xyz; public class myTest{ public static int myMul(int x, int y){ return x * y;} public static void main(String[] args){ int x = 3, y = 6; System.out.println(myMul(x,y)); } }
之后我们进行测试,在命令行中进行下面的操作,可以看到目录的结构:
然后我们利用maven将编写的java文件编译成class文件,这里使用cmd,将目录切换到项目的根目录,即src所在的目录。启动cmd,输入命令mvn compile
,编译项目下的所有的文件。这时就会进行下面的过程,或者第一次使用maven的话,那么会进行一些资源的Downloading。默认是会下载到上面提到的C盘的User……下。
编译完后我们就能在src目录下看到一个同级的目录:target。target中就有我们编译完成的文件。
我们运行这个.class文件,在命令行中输入下面的代码即可,可以看到代码成功输出了答案18.
另外如果是初次使用maven的话,在上述的编译过程中会出现下载Downloading的界面,上面解释了下载的文件会默认存储在C:\Users\(登录操作系统的用户名)Administrator\\.m2\repository
下,即C盘下。其实我们可以更换这个位置,步骤如下。
2.1.2 设置本机存放资源目录位置
设置本机存放资源目录的位置:
1.找到:maven安装目录/conf/settings.xml。先备份setting.xml
2.修改的目录,注意目录中不要含有中文。
将settings.xml中的增加成下图所示:
保存即可。
2.2 仓库
2.1.1仓库的概念
- 仓库是什么?
仓库是用来存放东西的,存放maven使用的jar和我们项目使用的jar
maven使用的各种插件(各种jar)
项目使用的jar(第三方的工具)
- 仓库的分类
本地仓库:个人计算机上的文件夹,存放各种jar
远程仓库:在互联网上的,需要使用网络才能使用的仓库
①中央仓库:最权威的,所有的开发人员都共享使用的一个集中的仓库。
②中央仓库的镜像:中央仓库的备份,在各大洲,重要的城市都有这个镜像
③私服:在公司的内部,在局域网中使用,不是对外使用的。
2.1.2 仓库的使用
maven仓库的使用不需要人为的干预。
如:开发人员需要使用mysql的驱动–>maven首先查本地仓库—>判断有无本地资源
查询顺序:私服—>中央仓库的镜像—>中央仓库
2.3 POM文件
pom:Project Object Model项目对象模型
2.3.1 坐标
在上述我们使用的pom文件中就有下面的信息。【groupId】+【artifactId】+【version】 = 坐标。坐标是在互联网上唯一标识一个项目的标记。
<groupId>com.bjpwoernode.maven</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
坐标通常表现为下面的形式:
<groupId>公司域名倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定义版本号</version>
如何使用坐标?定位!
Maven Repository: Search/Browse/Explore (mvnrepository.com):搜索使用的中央仓库,使用groupId或者artifactId作为搜索
以mySql为例搜索可以得到下面的结果:
2.3.2 packaging
打包后压缩文件的扩展名,默认是jar。web应用是war
packaging也可以不写,不写也是jar
2.3.3 依赖dependency
dependencies和dependency:项目中要使用的各种资源说明,比如我的项目要使用mySql驱动:
可以这样添加依赖:
2.3.4配置属性properties
配置属性properties:用来定义一系列属性的。方便日后统一升级。
2.3.5 构建build
maven在进行项目的构建时,配置信息,例如指定编译java代码是用的jdk的版本等
2.4 Maven的生命周期
构建项目所经历的编译测试,打包,部署
maven的生命周期就是Maven构建项目的过程:清理,编译,测试,报告,打包,安装,部署
maven的插件:maven命令执行时真正完成功能的是插件,插件就是一些jar,就是一些java类
2.5 Maven的常见命令
maven的命令:maven可以独立使用,通过命令来完成项目的生命周期过程
-
maven clean
清理之前已经编译的内容,但不会清理已经下载的jar
-
maven compile
编译主程序:main/java下的所有程序
-
mvn test-compile
编译main/test下的所有程序
-
mvn test
-
mvn package
-
mvn install
-
mvn depoly
2.6 Maven的单元测试
1)单元测试(测试方法的):用的是Junit,Junit是一个专门测试的框架(工具)。
Junit测试的内容:测试的是类中的方法,每一个方法都是独立测试的。
方法是测试的基本单位(单元)。
maven借助单元测试,批量测试类中的大量方法是否符合预期的。
2)使用步骤
1.加入依赖,在pom文件中添加依赖项,如下:
-
在maven项目中的src/test/java目录下,创建测试程序
推荐的创建类和方法的提示:
- 测试类的方法和名称 是Test + 你要测试的类名
- 测试的方法名称使用搞得是 Test + 方法的名字
例如,我们需要测试myTest:创建TestmyTest
@Test public void TestmyMul{ //测试myTest的myMul方法是否正确 }
其中
TestmyMul
叫测试方法,它的定义规则:- 方法必须是public
- 方法必须没有返回值
- 方法名是自定义的,但建议使用Test + 方法名称
- 在方法的上面加上注解:
@Test
命令测试及单元测试
单元测试过程:
打开pom.xml文件,添加单元测试所需要的Junit依赖项:
在src/test/java下编写测试代码:
注意,我们要测试的程序myTest是在syq.xyz
包下,我们这里要编写的测试程序也必须在这个包下,所以我们在src/test/java
路径下建包:syq.xyz
,然后在包下编写符合规范的测试类和测试方法。编写的类如下:
package syq.xyz;
import org.junit.Assert;
import org.junit.Test;
import java.sql.SQLOutput;
public class TestmyTest{
@Test
public void testmyMul(){
myTest my = new myTest();
int res = my.myMul(10,20);
//验证10*20是不是200, Junit提供的方法,用于结果对比
//assertEquals(期望值,实际值),如果两个值相等,说明是正确的,不等就会抛异常
Assert.assertEquals(200, res);
}
}
下面我们尝试使用各种命令:
- mvn clean
在项目的src
同级目录下打开cmd,执行mvn clean
命令
可以看到执行完命令后原先的target文件夹消失了。之前的下载的资源被删除,使用的是maven clean plugin插件。
- mvn compile
编译main\java
目录下的java文件为class文件,同时把class 文件拷贝到target/classes
目录下面,同时把main/resources
目录下的所有文件都拷贝到``
使用的是maven recource插件
- mvn test-compile
test-compile命令是将test目录下的测试程序进行编译,将java编译为class文件。
- mvn test
在执行这个命令时,上述所有的命令都会被执行一次。所以修改了test中的测试代码可以不用再进行一个mvn test-compile。直接运行mvn test
,上述都过程会被自动执行。
mvn test
会执行测试程序,并给出测试的结果:
上述的情况只是测试成功的情况,对于测试失败的情况会出现异常的抛出。我们修改测试类TestmyTest.java
:
然后我们使用命令行再次进行mvn test
观察输出情况:
我们在上面给出的目录中可以查阅打印的报告:
最后我们修改代码到正常状态,接着测试一次:
package syq.xyz;
import org.junit.Assert;
import org.junit.Test;
public class TestmyTest{
@Test
public void testmyMul(){
myTest my = new myTest();
int res = my.myMul(10,20);
//验证10*20是不是200, Junit提供的方法,用于结果对比
//assertEquals(期望值,实际值),如果两个值相等,说明是正确的,不等就会抛异常
Assert.assertEquals(200, res);
}
@Test
public void testmyMul2(){ //再编写一个测试程序
myTest my2 = new myTest();
int res = my2.myMul(10,30);
//故意使用一个错误的期望值:
Assert.assertEquals(300,res);
}
}
修改后测试无异常:
- mvn package
打包只打包的是src/main
下面的内容。没有测试的类。
执行package的时候整个过程又运行了一次。打包的结果放在目录target\ch01-maven-1.0-SNAPSHOT.jar
。
- mvn install
安装主程序(把本工程打包,并且按照本工程的坐标安装到本地仓库中去)
将运行结果进行了安装。