>> Maven 介绍
Apache Maven 是一个软件项目管理的综合工具。
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准的目录结构和默认构建生命周期。在多个开发团队环境时,Maven 可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven 让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。
1、Maven 提供了开发人员的方式来管理:
- Builds
- Documentation
- Reporting
- Dependencies
- SCM(Software Configuration Management)
- Releases
- Distribution
- mailing list
概括地说,Maven 简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven 增加可重用性并负责建立相关的任务。
2、Maven 两大核心:
(1)依赖管理:就是对jar包统一管理的过程;
(2)项目构建: 项目在编码完成后,对项目进行编译、测试、打包、部署一系列的操作都通过命令来实现,每一步操作都对应一个命令;(使用Eclipse也可以实现)
Eg:通过Maven命令将web项目发布到Tomcat:命令行进入到pom.xml
目录下,执行mvn tomcat:run
,然后会有链接地址,直接复制到浏览器打开即可;
3、Maven 三种仓库类型:
>> Maven 安装与配置
(1)安装配置Java
(2)安装Eclipse
(3)下载Maven
下载地址: http://maven.apache.org/download.cgi#
-
1、下载后直接解压缩即可(解压目录不要有中文、空格);
-
2、配置环境变量:“我的电脑”右键菜单—>属性—>高级—>环境变量—>系统变量—>新建—>在path里面添加
D:\Maven\apache-maven-3.5.2-bin\apache-maven-3.5.2\bin;
-
3、在 Windows 命令提示符下输入“mvn -version”查看 Maven 是否成功:
-
4、修改
...\apache-maven-3.3.3\conf\settings.xml
文件,配置本地仓库(让Maven程序知道仓库在哪): -
(1) 修改 Maven 仓库的路径:大概在54行的位置做如下修改:
<localRepository>E:/MavenRepository</localRepository>
-
(2) 添加阿里云中央仓库地址:在
<mirror>...</mirror>
标签里添加代码:
-
(3) 修改Maven默认的编辑的版本信息:在
<profiles>...</profiles>
标签里面添加代码:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
-----------------------------------------------------------------------
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
(4)命令行方式创建Maven项目
参考链接:https://jingyan.baidu.com/article/b0b63dbfc52e9b4a49307054.html
-
1、我们可以在任意目录下来创建 Maven 项目,一般的项目格式如下:(注意要切换到存放项目的盘符E:\MavenRepository)
cmd:mvn archetype:generate -DgroupId=com.jase.test -DartifactId=MyWebDriver -Dversion=1.0
-
mvn archetype:generate 创建Maven项目
-
generate 用于创建 Maven 项目;
-
DgroupId 指定包的名称;
-
DartifactId 指定项目名称;
-
Dversion 指定版本号;
-
2、由于是首次创建项目,所以,Maven 需要下载一些基础的依赖包,这个过程会相对比较漫长。当项目创建结束,会在当前目录下生成MyWebDriver 项目。但现在生成的项目还不能直接导入到Eclipse 中,还需要执行以下命令:
> cd MyWebDriver
MyWebDriver> mvn clean compile //clean 清除项目中的生成结果;compile 编译测试程序
MyWebDriver> mvn eclipse:eclipse //eclipse:eclipse :生成 Eclipse 项目文件
-
3、下面就可以通过Eclpse 导入MyWebDriver 项目,启动Eclipse,选择菜单栏File–>Import–>Existing
Projects into Workspace --> 点击“Next”,添加本 MyWebDriver 目录。
-
4、配置Maven程序:
-
5、修改Maven 配置文件路径。在Eclipse 菜单栏选择Window–>Perferences–>Maven–>User Settings。
-
6、构建索引:提高检索速度:
Window --> Show View --> Other --> Maven Repositories
>> 包的管理与更新 - pom.xml
Maven 中央仓库地址:http://search.maven.org/
在 Maven 中由 pom.xml
文件对当前项目的包进行管理,在我们创建的 MyWebDriver 项目中找到该文件打开:
<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.jase.test</groupId>
<artifactId>MyWebDriver</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>MyWebDriver</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- project:pom.xml 文件中的顶层元素;
- modelVersion:指明 POM 使用的对象模型的版本。这个值很少改动。
- groupId:指明创建项目的组织或者小组的唯一标识。GroupId 是项目的关键标识,典型的,此标识以组织的完全限定名来定义。比如,org.apache.maven.plugins 是所有 Maven 插件项目指定的 groupId。
- artifactId:指明此项目产生的主要产品的基本名称。项目的主要产品通常为一个 JAR 文件。第二, 象源代码包通常使用 artifactId 作为最后名称的一部分。典型的产品名称使用这个格式:
<artifactId>- <version>. <extension>
(比如:myapp-1.0.jar)。 - version:项目产品的版本号。Maven 帮助你管理版本,可以经常看到 SNAPSHOT 这个版本,表明项目处于开发阶段。
- name:项目的显示名称,通常用于 maven 产生的文档中。
- url:指定项目站点,通常用于 maven 产生的文档中。
- description:描述此项目,通常用于 maven 产生的文档中。
对于一个项目中只有下面的一部分是我们需要关注的:
<groupId>com.chongshi.test</groupId>
<artifactId>hello</artifactId>
<version>1.0</version> //版本可以到 Maven 的中央仓库去查询 <http://search.maven.org/>
<scope></scope> //主要管理依赖的部署的范围。使用5个值:compile、test、runtime、provided、system
通过查看 pom.xml 中 Junit 的配置,显然版本有些旧了,我们去下载最新的 Junit4,但我们又不知道Maven 中的具体的版本怎么办呢?我们可以到 Maven 的中央仓库去查询。
查询得到的版本号是4.12 ,下面修改配置 pom.xml 文件:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
重新在项目下执行“mvn eclipse:eclipse”命令 :MyWebDriver> mvn eclipse:eclipse
,打开项目的 Libraries,jar包在Referenced library 里面:
>> Maven 运行测试用例: Junit+Selenium
我们使用 maven,除了可以用它来方便管理 Java 的包外,另一个重要原因是可以用它来运行测试用例。下面我们就在项目中创建基于 Junit 的 web 自动化测试脚本。(注意是new Junit,不是class)
**注意:**测试用例一定要创建在 test 的目录中,如果创建在 main 目录中并不会被 maven 执行。
- 1、BaiduTest.java
package com.jase.test;
import ......
public class BaiduTest {
private WebDriver driver;
private String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new ChromeDriver();
baseUrl = "https://www.baidu.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testCase() throws Exception {
driver.get(baseUrl + "/");
driver.findElement(By.id("kw")).clear();
driver.findElement(By.id("kw")).sendKeys("maven test");
driver.findElement(By.id("su")).click();
Thread.sleep(2000);
String title =driver.getTitle();
assertEquals(title,"maven test_百度搜索");
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
}
- 2、下面通过 Maven 来执行测试:cmd下输入:
MyWebDriver> mvn clean //clean 清除项目中的生成结果
MyWebDriver> mvn test //test 执行测试
- 3、在执行 test 命令时会运行 Junit 测试用例,并且在产生运行日志;以下为运行测试的 log:
E:\Eclipse WorkSpace\MyWebDriver>mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MyWebDriver 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ MyWebDriver ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Eclipse WorkSpace\MyWebDriver\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ MyWebDriver ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ MyWebDriver ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Eclipse WorkSpace\MyWebDriver\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ MyWebDriver ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ MyWebDriver ---
[INFO] Surefire report directory: E:\Eclipse WorkSpace\MyWebDriver\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.jase.test.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 sec
Running com.jase.test.BaiduTest
Starting ChromeDriver 2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1) on port 39620
Only local connections are allowed.
一月 14, 2018 3:08:30 下午 org.openqa.selenium.remote.ProtocolHandshake createSession
信息: Detected dialect: OSS
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 19.616 sec
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21.827 s
[INFO] Finished at: 2018-01-14T15:08:44+08:00
[INFO] Final Memory: 10M/110M
[INFO] ------------------------------------------------------------------------
注意编码问题:
maven的pom.xml里面编码用的是UTF-8,要修改eclipse里面编码为UTF-8,否则执行测试用例可能会出现错误;
Eclipse --> Winows --> Preference -->
>> Maven 常用命令
Eclipse能做的操作,通过Maven命令都可以实现,但是前提是项目符合Maven项目的目录规范;Maven目录结构可以手动创建,也可以通过IDE实现;
|命令|作用|
|–|
|mvn archetype:generate| 创建Maven项目|
|mvn clean| 清除项目目录中的生成结果|
|mvn compile |编译源代码|
|mvn test-compile|编译测试源代码|
|mvn test |运行应用程序中的单元测试|
|mvn package |根据项目生成的jar|
|mvn install |在本地Repository中安装jar|
|mvn deploy |发布项目|
|mvn site |生成项目相关信息的网站|
|mvn eclipse:eclipse |生成eclipse项目文件|
|mvn jetty:run |启动jetty服务|
|mvn tomcat:run| 启动tomcat服务|
|mvn clean package -Dmaven.test.skip=true:|清除以前的包后重新打包,跳过测试类|
-
mvn clean
:删除项目根目录下的target文件夹(.class
文件);执行这个命令使用的是Maven仓库下的maven-clean-plugin
工具;
相当于EclipseProject --> Clean
-
mvn compile
:将项目中的.java
文件编译成.class
文件;使用的是maven-compiler-plugin
工具; -
mvn test
:将项目根目录下的src/test/java目录下的单元测试类都会执行;单元测试类名有要求:XxxxTest.java;
在eclipse下点开test文件夹下的测试类,右键Run As --> Junit Test
; -
mvn package
:web project -- war包
、java project -- jar包
:将项目打包到项目根目录下的target目录下;
Eclipse下在项目名右键导出 jar包、war包; -
mvn install
:解决本地多个项目共用一个jar包问题,打包到本地仓库;其他项目需要使用这个jar包的内容时只需要在pom.xml文件里配置路径即可;这个项目需要修改时,只需在修改后重新执行install命令即可;
>> Maven 项目的生命周期
在Maven中存在3套生命周期,每一套生命周期相互独立,互不影响;在一套生命周期内,执行后面的命令,前面操作会自动执行;
-
CleanLifeCycle:清理生命周期 -->
clean
-
DefaultLifeCycle:默认生命周期 -->
compile --> test --> package --> install --> deploy
-
SiteLifeCycle:站点生命周期 -->
site
>> Maven 依赖范围
<scope></scope>
,它主要管理依赖的部署:jar包对项目的作用范围(对于编译、测试、运行时classpath有效);运行就是部署到Tomcat;
目前可以使用 5 个值:
-
compile:缺省值,适用于所有阶段,会随着项目一起发布。
-
test:只在测试时使用,用于编译和运行测试代码。不会随项目发布。
-
provided:运行部署到Tomcat不再需要,如 servlet-api.jar。
若servlet-api不设置成provided,采用默认的compile,部署到Tomcat的时候,就会在打包成war包的时候,把这个jar包也打包进去,然后在Tomcat里面运行这个war包,但是Tomcat的lib里面也有servlet-api这个jar包,这样项目中也有jar包,就会发生jar包冲突的问题,so项目在请求这个jar包的时候就会报错,运行失败; -
runtime:只在运行时使用,如 JDBC 驱动,适用运行和测试阶段。
-
system:类似 provided,需要显式提供包含依赖的 jar,Maven 不会在 Repository 中查找它。
|依赖范围|对于编译classpath有效|对于测试classpath有效|对于运行时classpath有效|例子|
|–|
|compile|Y|Y|Y|spring-core|
|test|-|Y|-|junit(设置成默认无影响)|
|provided|Y|Y|-|servlet-api
、jsp-api
(必须设置成provide)|
|runtime|-|Y|Y|JDBC驱动(设置成默认无影响)|
|system|Y|Y|-|本地的Maven仓库之外的类库|
总结:若使用到Tomcat自带的jar包,将项目中依赖的作用范围设置为provided;
servlet-api
jsp-api