1、什么是maven
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理
1.1、什么是构建
1.2、项目构建的方式
1、Eclipse
手工操作较多,项目的构建过程都是独立的,很难一步完成。比如:编译、测试、部署等。
开发时每个人的IDE配置都不同,很容易出现本地代码换个地方编译就出错
2、Ant
Ant只是一个项目构建工具,它没有集成依赖管理。
Ant在进行项目构建时,它没有对项目目录结构进行约定,需要手动指定源文件、类文件等目录地址。同时它执行task时,需要显示指定依赖的task,这样会造成大量的代码重复。
3、Maven
Maven不仅是一个项目构建工具,更是一个项目管理工具。它在项目构建工程中,比ant更全面,更灵活。Maven在进行项目构建时,它对项目目录结构拥有约定,知道你的源代码在哪里,类文件应该放到哪里去。它拥有生命周期的概念,maven的生命周期是有顺序的,在执行后面的生命周期的任务时,不需要显示的配置前面任务的生命周期。例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
2、Maven安装配置
2.1 下载maven
本课程使用的maven的版本为3.0.5。Maven是使用java开发,需要安装jdk1.6以上,推荐使用1.7
2.2 Maven的安装
第一步:安装jdk,要求1.6或以上版本。
第二步:把maven解压缩,解压目录最好不要有中文。
第三步:配置环境变量MAVEN_HOME
第四步:配置环境变量PATH,将%MAVEN_HOME%\bin加入Path中,在Windows中一定要注意要用分号;与其他值隔开。
第五步:验证是否安装成功,打开cmd窗口,输入mvn –v
2.3 Maven的配置
Maven有两个settings.xml配置文件,一个是全局配置文件,一个是用户配置文件。
1.1.1 全局配置(默认)
%MAVEN_HOME%/conf/settings.xml 是maven全局的配置文件。
该配置文件中配置了本地仓库的路径,默认就是:~/.m2/repository。其中~表示当前用户路径C:\Users\[UserName]。
localRepository:用户仓库,用于检索依赖包路径
~/.m2/settings.xml是用户的配置文件(默认没有该文件,需要将全局配置文件拷贝过来在进行修改)
注意:一般本地仓库的地址不使用默认配置,通常情况下需要在用户配置中,配置新的仓库地址。
配置步骤如下:
第一步:创建一个本地仓库目录,比如E:\08-repo\0707\repository。
第二步:复制maven的全局配置文件到~/.m2目录下,即创建用户配置文件
第三步:修改maven的用户配置文件。
注意:
用户级别的仓库在全局配置中一旦设置,全局配置将不再生效,转用用户所设置的仓库,否则使用全局配置文件中的默认路径仓库。
3.1 Maven的工程结构
Project
|-src
| |-main
| | |-java ——存放项目的.java文件
| | |-resources ——存放项目资源文件,如spring, hibernate配置文件
| |-test
| |-java ——存放所有测试.java文件,如JUnit测试类
| |-resources —— 测试资源文件
|-target —— 目标文件输出位置例如.class、.jar、.war文件
|-pom.xml3.2 Maven的工程创建
3.2.1 第一步:根据maven的目录结构创建helloMaven工程
target目录会在编译之后自动创建。
3.2.2 第二步:创建HelloWorld.java
在src/main/java/cn/itcast/maven目录下新建文件Hello.java
package cn.itcast.maven;
public class HelloWorld { public String sayHello(String name){ return "Hello World :" + name + "!"; } } |
3.2.3 第三步:创建TestHelloWorld.java
package cn.itcast.maven;
import org.junit.Test; import static junit.framework.Assert.*;
public class TestHelloWorld{
@Test public void testSayHello(){ HelloWorld hw = new HelloWorld(); String result = hw.sayHello("zhangsan"); assertEquals("hello zhangsan",result); } } |
3.2.4 第四步:配置pom.xml
<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"> <!-- 版本:4.0.0 --> <modelVersion>4.0.0</modelVersion> <!-- 组织名称:暂时使用 组织名称+项目名称 作为组织名称 --> <!-- 组织名称:实际名称 按照访问路径规范设置,通常以功能作为名称:eg: junit spring --> <groupId>cn.itcast.maven</groupId> <!-- 项目名称 --> <artifactId>HelloWorld</artifactId> <!-- 当前项目版本号:同一个项目开发过程中可以发布多个版本,此处标示0.0.1版 --> <!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号 --> <version>0.0.1</version> <!-- 名称:可省略 --> <name>Hello</name>
<!-- 依赖关系 --> <dependencies> <!-- 依赖设置 --> <dependency> <!-- 依赖组织名称 --> <groupId>junit</groupId> <!-- 依赖项目名称 --> <artifactId>junit</artifactId> <!-- 依赖版本名称 --> <version>4.9</version> <!-- 依赖范围:test包下依赖该设置 --> <scope>test</scope> </dependency>
</dependencies> </project>
|
3.3 Maven的命令
需要在pom.xml所在目录中执行以下命令。
3.3.1 Mvn compile
执行 mvn compile命令,完成编译操作
执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。
3.3.2 Mvn clean
执行 mvn clean命令
执行完毕后,会将target目录删除。
3.3.3 Mvn test
执行 mvn test命令,完成单元测试操作
执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)
3.3.4 Mvn package
执行 mvn package命令,完成打包操作
执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war
3.3.5 Mvn install
执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作
执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用
3.3.6 mvn clean compile命令
cmd 中录入 mvn clean compile命令
组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类
3.3.7 mvn clean test命令
cmd 中录入 mvn clean test命令
组合指令,先执行clean,再执行test,通常应用于测试环节
3.3.8 mvn clean package命令
cmd 中录入 mvn clean package命令
组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前
执行过程:
清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包
3.3.9 mvn clean install命令
cmd 中录入 mvn clean install查看仓库,当前项目被发布到仓库中
组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前
执行过程:
清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包
部署————将打好的包发布到资源仓库中
4 M2Eclipse
M2Eclipse是eclipse中的maven插件
4.1 安装配置M2Eclipse插件
4.1.1 第一步:将以下包中的插件进行复制。
4.1.2 第二步:粘贴到eclipse中的dropins目录中
4.1.3 第三步:查看eclipse中是否有maven插件
4.1.4 第四步:设置maven安装目录
4.1.5 第五步:设置用户配置
4.2 创建maven工程
4.2.1 通过骨架创建maven工程
4.2.1.1 创建工程
第一步:选择new→maven→Maven Project
第二步:next
第三步:next
选择maven的工程骨架,这里我们选择quickstart。
第四步:next
输入GroupId、ArtifactId、Version、Package信息点击finish完成。
4.2.1.2 创建MavenFirst.java
在src/main/java中创建cn.itcast.maven包,然后创建MavenFirst.java
package cn.itcast.maven;
public class MavenFirst {
public String sayHello(String name) { return "hello " + name; } }
|
4.2.1.3 创建TestMavenFirst.java
在src/test/java中创建cn.itcast.maven包,然后创建TestMavenFirst.java
package cn.itcast.maven;
import org.junit.Assert; import org.junit.Test;
public class TestMavenFirst {
@Test public void testSayHello() { MavenFirst first = new MavenFirst();
String result = first.sayHello("zhangsan");
Assert.assertEquals("hello zhangsan", result); } }
|
4.2.1.4 执行maven命令进行测试
在Eclipse的maven插件中执行maven命令,需要在maven工程或者pom.xml文件上点击右键,选择Run as→maven build..
可以在菜单中看到maven常用的命令已经以菜单的形式出现。
例如:
Maven clean
Maven install
Maven package
Maven test
Maven build和maven build... 并不是maven的命令。
maven build...只是提供一个命令输入功能,可以在此功能中输入自定义的maven命令。
maven build的功能就是执行上次自定义命令。
4.2.1 不通过骨架创建maven工程
通过选择骨架创建maven工程,每次选择骨架时都需要联网下载,如果网络不通或者较慢的情况下会有很长时间的等待。使用很是不方便,所以创建工程时可以不选择骨架直接创建工程。
4.2.1.1 创建工程
第一步:选择new→maven→Maven Project
第二步:next
第三步:next
Packaging:指定打包方式,默认为jar。选项有:jar、war、pom。
第四步:点击finish,完成maven工程创建。
4.2.1.2 修改pom文件
在Maven-second工程中依赖使用maven-first工程的代码
<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>maven-second</artifactId> <version>0.0.1-SNAPSHOT</version>
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>cn.itcast.maven</groupId> <artifactId>maven-first</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project> |
4.2.1.3 创建MavenSecond.java
package cn.itcast.maven;
public class MavenSecond {
public String sayHello(String name) { MavenFirst first = new MavenFirst(); return first.sayHello(name) + ":second"; }
}
|
4.2.1.4 创建TestMavenSecond.java
package cn.itcast.maven;
import org.junit.Assert; import org.junit.Test;
public class TestMavenSecond {
@Test public void testSayHello() { MavenSecond second = new MavenSecond();
String result = second.sayHello("zhangsan");
Assert.assertEquals("hello zhangsan:second", result); }
}
|
4.2.1.5 测试工程
|
如果maven-first工程没有安装则会出现以下错误:
[INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building maven-second 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [WARNING] The POM for cn.itcast:maven-first:jar:0.0.1-SNAPSHOT is missing, no dependency information available [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.218s [INFO] Finished at: Fri Sep 25 15:06:00 CST 2015 [INFO] Final Memory: 4M/15M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project maven-second: Could not resolve dependencies for project cn.itcast:maven-second:jar:0.0.1-SNAPSHOT:Could not find artifact cn.itcast:maven-first:jar:0.0.1-SNAPSHOT -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException |
提示找不到maven-first的jar包。当系统运行时是从本地仓库中找依赖的jar包的,所以必须先将maven-first安装才能正常运行,需要在maven-first工程上运行 mvn install命令安装到本地仓库。