简介
Maven是一个用于项目管理的工具,其好处是为我们管理jar包的依赖版本,同时也方便的组合我们自己的代码模块。在入门前有两个概念先简单介绍一下,一个是坐标,另一个是仓库。
坐标:maven为每一个jar包或模块都定义了一个坐标,坐标代表了一个特定jar包及版本。坐标定义在项目的pom.xml文件中,有三个重要标签:groupId、artifactId、version,其他模块调用可以通过在自己的pom.xml中引用此坐标,从而引用此jar包的功能(就像eclipse中导入jar的功能一样)。
仓库:maven提供了一个仓库,仓库管理着项目所需要的jar包,所有本地项目指向这个仓库,从仓库中获取jar依赖。仓库有两个层级,一个是本地仓库,另一个是maven的中央仓库。本地仓库在maven首次使用时自动创建,windows默认路径是~/.m/repository/,在linux中默认路径是${user_home}/.m/repository/,这个路径是可以自定义的,后面再说;中央仓库是一个maven远程仓库,管理着几乎所有的开源jar包。当我们使用maven工具,或者编译项目依赖时,maven首先从本地仓库需找jar依赖,如果本地仓库没有对应的jar包,则从中央仓库下载需要的插件和jar包到本地仓库,若有其他本地项目再需引用同样的jar包,则直接可从本地仓库获取依赖。
现在不多说mavne的理论概念,我们先来上手写个入门例子。创建一个maven项目有三种方式:
1.直接手动构建路径,pom.xml,及java文件;
2.用maven命令来自动生成一个maven结构的项目;
3.用eclipse来创建一个maven项目。
这里我们从零开始,用方式1,手动创建一个maven项目。
maven环境搭建
3.1系统变量:M2_HOME,值:D:\maven_home\apache-maven-3.2.5\
3.2 系统变量:Path,修改值,行首添加:%M2_HOME%\bin;
4.测试maven安装结果,使用命令:mvn–v。输出结果:
手动创建一个maven项目
package com.realla;
public class HelloMaven{
public String sayHello(String name){
return "Hello:"+name;
}
}
1.3 TestHelloMaven.java代码:
package com.realla;
import org.junit.*;
import static org.junit.Assert.*;
public class TestHelloMaven{
@Test
public void testHelloMaven(){
HelloMaven hm = new HelloMaven();
String str = hm.sayHello("maven");
assertEquals(str,"Hello:maven");
}
}
1.4 pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.realla</groupId>
<artifactId>maven_part1</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>maven_part1</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Pom.xml文件是maven项目的重要配置文件,这里先做一个简单说明:
Pom.xml的根节点是<project>,在文件的开头与很多xml的配置文件一样,需要自己的schema定义,从现成的pom.xml中拷贝即可。其中有几个重要标签:
<groupId>:组ID,指一个项目的名称,命名规范为:部门+项目名。
<artifactId>:模块的名称。一个项目中可能有多个模块,这些模块各自进行开发,所以其命名规范就是我们的模块名。
<version>:版本号。一般为1.0-SNAPSHOT,代表开发阶段的快照。
<package>:开发后,打包的方式。这里是打包成jar文件,也可以设置成war。
<dependency>:dependency配置的是我们项目所依赖的jar文件。与我们自己的项目一样,每个jar文件都有三个坐标标签<groupId>、<artifactId>、<version>。这三个标签值决定了一个jar包。当我们在项目中定义了所有依赖jar的这些属性后,在编译时,项目会先从本地仓库中寻找已有的jar依赖,如果没有,在向maven的中央仓库寻找并下载所需的jar依赖。<dependency>的这几个属性如何配置,可访问中央仓库(http://mvnrepository.com/),搜索需要的jar包,网页可以显示此jar依赖所需要的配置语句,直接拷贝过来即可。本例子中,因为测试时需要依赖junit包,所以dependency中需要配置对此包的引用。
2.建完上面的路径和java文件后,使用cmd,进入文件夹:d:\maven_home\projects\maven_part1,进行命令操作。2.2 然后执行命令:maven test,maven会显示测试结果,如果测试正确,会显示如下:
简单说明:maven管理项目的一个重要功能是管理我们项目依赖的jar包,这里有一个重要概念是仓库。当我们用<dependency>标签配置了我们项目需要的jar包以后,编译期间,maven会先从本地仓库中获取依赖,如果本地仓库中没有此依赖,则会转向maven的中央仓库下载相应的jar依赖。本地仓库是由maven配置管理的。
对于maven命令:”maven package”,是在当前项目路径下生成一个项目的jar包,如果不做其他操作,本地的其他模块不能引用此jar包;”maven install”命令,则将项目jar包发布到我们的本地仓库中,那么我们本地的其他模块,只要在pom.xml中定义相关的<dependency>标签值,就可以调用此jar包了。package com.invocation;
import com.realla.HelloMaven;
public class Hello{
public String sayInvocation(String name){
//调用maven_part1中的HelloMaven类
HelloMaven hm = new HelloMaven();
return hm.sayHello(name);
}
}
3.3 TestHello.java代码如下:
package com.invocation;
import org.junit.*;
import static org.junit.Assert.*;
public class TestHello{
@Test
public void testSayInvocation(){
Hello hello = new Hello();
String str = hello.sayInvocation("maven");
assertEquals(str,"Hello:maven");
}
}
3.4 对应的pom.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.invocation</groupId>
<artifactId>maven_part2</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>maven_part2</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.realla</groupId>
<artifactId>maven_part1</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- <scope>test</scope> 不能要-->
</dependency>
</dependencies>
</project>
3.5 说明
刚开始,我对maven_part2编译时报错,说com.realla.HelloMaven对象找不到,原因是maven_part2的pom.xml文件的<dependency>标签多加了一个属性<scope>test</scope>(上面的注释部分),当设置了此属性后,这个包只在测试时有效,而我的HelloMaven对象是在我的main路径中的Hello.java中引用的,很明显这不是一个测试路径,所以会报错;
然后我将scope删掉,然后还报错,说org.junit不存在,原因是maven_part2中的pom.xml文件我没有配置junit依赖,配置完后,编译正常。用maven命令来创建项目
这里需要用到命令:mvn archetype:generate。
这里的archetype是一个插件,generate是目标的(goal),此命令时maven调用archetype插件执行generate目标。
此命令可以直接使用,那么在命令执行时,会有一系列操作。其中会让开发者输入项目的坐标(groupId、archetypeId、packaging、version)
当然,也可以在命令后面指定参数,直接定义项目坐标:
Mvn archetype:generate -DgroupId=com.realla.command -DartifactId=maven_part3 -Dpackaging=com.realla.command -Dversion=0.0.1-SNAPSHOT
在执行命令时,就不必在指定项目坐标。执行结果:
生成项目如下,然后我们可以在此基础上修改:
用eclipse创建maven项目
修改myeclipse使用指定maven:
Window/preferences/Myeclipse/Maven4MyEclipse/Installations,点击add,添加指定的maven路径:
修改本地仓库的路径,首先修改本地%M2_HOME%/conf/settings.xml中的本地仓库的位置,然后让Myeclipse指向此settings.xml配置文件即可:
Window/preferences/MyEclipse/Maven4MyEclipse/userSettings
至此,MyEclipse的maven配置完成,可以创建maven项目了:
右键/new/other》选择Maven Project》next》next》选择archetype(一般选:maven-archetype-quickstart;如果是创建web项目,则选:maven-archetype-webapp)》next》定义项目坐标》finish。完成创建。下图则是我创建的maven_part4项目结构:
好了,用myeclipse创建一个quickstart maven项目就完成了。
至于具体在myeclipse中如何操作配置maven项目,可以参考链接(转):http://b-l-east.iteye.com/blog/1246482