Maven是跨平台的项目管理工具。主要服务于基于JAVA平台的项目构建,依赖管理和项目信息管理。
项目构建:清理-->编译-->测试-->报告-->打包-->部署
Maven模型
Maven的安装:
1. 检查jdk安装的情况(要1.6版本):Echo %JAVA_HOME% Java -version
2. 对apache-maven-3.0.3-bin.zip进行解压缩,例如解压到如下目录(解压目录最好不要有中文字)
3. 设置系统环境变量,MAVEN_HOME
4. 设置环境变量Path,将%MAVEN_HOME%in加入Path中,一定要注意要用分号;与其他值隔开
5. 验证安装是否成功,打开cmd窗口,敲入mvn –v 查看;
最后配置仓库地址和复制配置文件。
Maven的约束 :
- src/main/java —— 存放项目的.java文件。
- src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件。
- src/test/java —— 存放所有测试.java文件,如JUnit测试类。
- src/test/resources —— 测试资源文件。
- target —— 项目输出位置。
- pom.xml ——maven项目核心配置文件。
第一个Maven程序:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
第一步. 首先建立MavenHelloWorld项目同时建立Maven约定的目录结构 MavenHelloWorld src main java resources(暂时省略) test java resources(暂时省略) pom.xml 第二步:在src/main/java/cn/itcast/maven目录下新建文件Hello.java package cn.itcast.maven; public class HelloWorld { public String sayHello(String name){ return "Hello World :" + name + "!"; } } 第三步:在/src/test/java/cn/itcast/maven目录下新建测试文件HelloTest.java package cn.itcast.maven; import org.junit.Test; import static junit.framework.Assert.*; public class HelloTest { @Test public void testHello(){ Hello hello = new Hello(); String results = hello.sayHello("maven"); assertEquals("Hello maven!",results); } } 第四步:在项目MavenHelloWorld根目录建立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> 第五步: a)打开cmd命令行,进入Hello项目根目录(包含有pom.xml文件的目录) b)执行 mvn compile命令 执行完毕后,生成了maven工程编译完成后字节码文件的生成目录target c)cmd 中继续录入mvn clean命令 执行完毕后,字节码生成目录被删除 d)cmd 中录入 mvn clean test命令 执行完毕后,字节码生成目录中生成了被测试类与测试类的编译字节码和测试执行过程日志与详细报告 e)cmd 中录入 mvn clean compile命令 组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类 f)cmd 中录入 mvn clean test命令 组合指令,先执行clean,再执行test,通常应用于测试环节 g)cmd 中录入 mvn clean package命令 组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前 执行过程: 清理————清空环境 编译————编译源码 测试————测试源码 打包————将编译的非测试类打包 h)cmd 中录入 mvn clean install 查看仓库,当前项目被发布到仓库中 组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前 执行过程: 清理————清空环境 编译————编译源码 测试————测试源码 打包————将编译的非测试类打包 部署————将打好的包发布到资源仓库中 ----------------------------------------------------------------- 错误范例: 说明:MAVEN 命令输入错误,命令名称显示在[ERROR] Unknown lifecycle phase "compoile" 引号中的内容为输入错误的名称 [ERROR] Unknown lifecycle phase "compoile". You must specify a valid lifecycle p hase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin -artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validat e, initialize, generate-sources, process-sources, generate-resources, process-re sources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-clas ses, test, prepare-package, package, pre-integration-test, integration-test, pos t-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-s ite, site, post-site, site-deploy. -> [Help 1]
第二个Maven程序:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
第六步:新建第二个项目模块HelloFriend目录及约定的目录结构 HelloFriend src main java resources(暂时省略) test java resources(暂时省略) pom.xml 第七步:在项目HelloFriend根目录建立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"> <modelVersion>4.0.0</modelVersion> <groupId>cn.itcast.maven</groupId> <artifactId>HelloFriend</artifactId> <version>0.0.1-SNAPSHOT</version> <name>HelloFriend</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <dependency> <groupId>itcast</groupId> <artifactId>HelloWorld</artifactId> <version>0.0.1</version> <scope>compile</scope> </dependency> </dependencies> </project> 第八步:在src/main/java/cn/itcast/maven目录下新建文件HelloFriend.java package cn.itcast.maven; import cn.itcast.maven.HelloWorld; public class HelloFriend { public String sayHelloToFriend(String name){ HelloWorld hw = new HelloWorld(); String str = hw.sayHello(name)+" I am "+this.getMyName(); System.out.println(str); return str; } public String getMyName(){ return "MAVEN"; } } 第九步:在/src/test/java/cn/itcast/maven目录下新建测试文件HelloFriendTest.java package cn.itcast.maven; import static junit.framework.Assert.assertEquals; import org.junit.Test; import cn.itcast.maven.Hello; public class HelloFriendTest { @Test public void tesHelloFriend(){ HelloFriend helloFriend = new HelloFriend(); String results = helloFriend.sayHelloToFriend("Jock"); assertEquals("Hello World Jock! I am MAVEN",results); } } 第十步:在HelloFriend目录下执行命令mvn package 系统报错说没有找到依赖 第十一步:需要重新构建HelloWorkd第一个项目并安装到数据仓库,在命令行HelloWorkd根目录下执行mvn clean install 第十二步:重新在HelloFriend目录下执行命令mvn package 成功
依赖配置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
依赖声明主要包含如下元素: <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> 其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下: 1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效 2.test:测试依赖范围。只对于测试classpath有效 3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api 4.runtime:运行时提供。例如:jdbc驱动 传递性依赖原则: A-->B A-->C 1.路径最近者优先 2.路径相同,第一声明者优先 注意: 1.dependencyManagement中定义的依赖子module不会共享 2.dependencies中定义的依赖子module可以共享 可选依赖不被传递 依赖优化:mvn dependency:list
依赖范围:
依赖范围对传递依赖的影响: