标签:
Maven发展起来的原因是,随着项目的扩大,项目经理每天都需要把svn上提交的代码,进行测试功能。如果测试一个功能要5分钟,如果有20个人的代码量,那么显然,并且每个人提交的代码不仅一个功能,那么显然项目经理啥都不用干了,天天测试代码,我们说的规模还不是特别大,如果再大点,显然项目经理面临着不可完成的任务。
Maven一个命令,就可以让工程,编译,测试,报告,打包,部署。如果没有Mavan,我们需要把svn项目checkout下来后,写测试类,使用单元测试,放到服务器中,通过浏览器来测试。显然Maven就是这么一个项目管理工具。
1 Maven自动管理jar包,你不再需要记住struts2,spring4,hibernate要使用哪些jar包,以后,都是maven帮助导入jar包。
2 如果几个项目类似于迭代开发,显然要每次都拷贝之前项目的jar放入当前项目下,有了maven,你也不必在做这些工作。
3 解决项目中相同插件有相同jar包,或者项目中jar包冲突问题。
Maven的使用必须是jdk1.6版本以上。
第一步,下载Maven,可以从apache下载。
第二步,设置path路径
在这里设置和吃了屎一样难受,
1.首先当然使用"open .bash_profile",打开该文件.
2.然后添加路径"export PATH=${PATH}:/Users/admin/Downloads/apache-maven-3.2.5/bin"
3.使用"source .bash_profile"让配置生效。这里如果你配置的路径有问题,会报错
4.按理说,前三部已经配置完毕,可使用"mvn -v"来效验是否配置成功了,我在这里报了2个错误,
第一个错误是"-bash: /Users/admin/Downloads/apache-maven-3.2.5/bin/mvn: Permission denied",说明权限不够,需要添加权限。使用“chmod a+x /Users/admin/Downloads/apache-maven-3.2.5/bin/mvn”。
第二个错误是"-bash: /Users/admin/Downloads/apache-maven-3.2.5/bin/mvn: /bin/sh: bad interpreter: Operation not permitted",国外的coder给出的解释是“OS X 10.7.3 or higher的版本设置了隔离属性,来阻止了执行,我们需要使用xattr -d com.apple.quarantine /bin/sh,来让其执行。下面就配置成了,
5.成功页面
repository(Mvn仓库):
不论project1,project2,project3分别需要哪些各自的jar包,都会从Maven仓库中去引用要用的jar包。显然Maven仓库存放了大量的jar包,加入你要做一个s2sh项目,那么仓库中就要有s2sh的所有jar包,之后当你开发s2sh项目的时候,只需要引入仓库中的jar包就ok了,
现在创建你自己的Maven仓库,也就是你以后要开发项目时,从这个你创建Maven仓库中去寻找jar包,我自己在/Users路径下创建了一个"mvn_repository"文件。
你创建了Mavan仓库后,需要告知Maven啊,原本Mavan给你提供了默认的Mavan仓库,既然我们创建了自己的,所以我们需要修改默认值。那么在哪里修改呢
在你下载的Mavan工具中,config目录下的有一个setting.xml文件,修改下列的路径。
<localRepository>/Users/mvn_repository</localRepository>
我们现在要利用Maven来管理项目,那么显然你要符合Mavan的约定,约定指的是你创建source folder的名字
src/main/java:存放项目的java文件
src/main/resource:存放项目的资源文件,如spring,hibernate的配置文件
src/test/java:存放所有测试文件
src/test/resource:存放测试用的资源文件
target:项目输出位置
pom.xml:当要从仓库中寻找jar包的时候用到的文件,但仅仅不只这一个功能。
public class Son { public void sonSay(){ System.out.println("我是儿子"); } } -------------------------------- public class SonTest { public static void main(String[] args) { Son son=new Son(); son.sonSay(); } }
<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.maven</groupId> <artifactId>fristItemSon</artifactId> <version>0.0.1-SNAPSHOT</version> <name>fristItemSon</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
【注意】 一定要cd到项目路径下,才能成功。
看到如下信息生成成功。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.632 s
[INFO] Finished at: 2016-02-20T14:56:27+08:00
[INFO] Final Memory: 9M/81M
[INFO] ------------------------------------------------------------------------
admindeMacBook-Pro:Son admin$ mvn clean
现在reflush你的项目,因为编译成功,所以reflush后可以看到target文件。也就是项目输出位置
清理:mvn clean后,reflush项目,发现target文件没有了。输出文件被删除了
编译:之前我们使用过了该命令
测试:可以看到Mavan帮我们运行了src/test/java下的文件。并把测试后的一些信息打印到了Termianl。
打包:看到target文件中生成了一个jar包
其中名字是根据pom.xml中生成的
把当前项目放入到Maven的类库中,你可以从你的Maven仓库中找到这个项目
你可以从生成的target中的surefire-reports文件中看到,文件下有以下两个文件。
com.dyp.maven.SonTest.txt是测试报告
TEST-com.dyp.maven.SonTest.xml是系统级的一些参数。
无论你执行了Mavan生命周期的第几个步骤,Mavan会自动执行他之前的步骤。比如当你输入"mvn test"的时候,Mavan会把"mvn clean -> mvn compile"都执行了。
public class Father { public void sonSay(){ //不要理会这里Son这里的报错, Son son=new Son(); son.sonSay(); } } ------------------------------ public class FatherTest { public static void main(String[] args) { Father father=new Father(); father.sonSay(); } }
<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.maven</groupId> <artifactId>secondItemFather</artifactId> <version>0.0.1-SNAPSHOT</version> <name>secondItemFather</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 内容就是Son项目中的pom.xml的配置,这里就告诉Maven,要想编译Father项目,需要Son的jar包--> <dependency> <groupId>com.maven</groupId> <artifactId>fristItemSon</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
如果你报了下面错误,那就是因为Maven编译你得Fahter项目时,去仓库中找Son项目,发现没有!所以你要首先把Son项目放到Mavan仓库的类库中,也就是使用"mvn install"把Son项目放进去。然后才可以编译Father项目
Failed to execute goal on project hellofriend: Could not resolve dependencies for project com.maven:hellofriend:jar:0.0.1-SNAPSHOT: Could not find artifact com.maven:hello:jar:0.0.1-SNAPSHOT -> [Help 1]
在这个项目中,我们在Father项目的pom.xml中配置了一些新东西,Mavan就自动把仓库中的Son项目交给了Father项目,使得Father项目可以使用Son项目中的了
public class GrandFather { public void grandFatherSay(){ Father father=new Father(); father.sonSay(); } } ---------------------------------------- public class GrandFatherTest { public static void main(String[] args) { GrandFather grandFather=new GrandFather(); grandFather.grandFatherSay(); } }
<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.maven</groupId> <artifactId>thirdItemGrandFather</artifactId> <version>0.0.1-SNAPSHOT</version> <name>thirdItemGrandFather</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 只配置了Father项目的jar包依赖.. --> <dependency> <groupId>com.maven</groupId> <artifactId>secondItemFather</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
【总结】
其实GrandFather项目仅仅配置了Father项目依赖,但实际上,GrandFather项目还使用到了Son项目中的类,但我们在Father项目中配置Son项目依赖,所以对于GrandFather项目来说,当我们配置了Father项目依赖的同时,Father项目把自身依赖的Son项目,也交给了GrandFather。这就是依赖的传递性
我在写这个项目还出现了一个错误
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project thirdItemGrandFather: Compilation failure: Compilation failure:
对于这个错误,网络上有很多解释,什么系统默认jdk版本不够等等。但是我最终解决这个问题是通过查阅Terminal给我提供的一个错误解决方法
,国外的回答如下
Unlike many other errors, this exception is not generated by the Maven core itself but by a plugin. As a rule of thumb, plugins use this error to signal a failure of the build because there is something wrong with the dependencies or sources of a project, e.g. a compilation or a test failure.
The concrete meaning of the exception depends on the plugin so please have a look at its documentation. The documentation for many common Maven plugins can be reached via our plugin index.
最终,我发现我的错误出在了测试类忘了写包名,导致测试类使用简单类时,因为一个是默认包,一个是指定包,导致了测试类没有import引入类,所以我写了和简单类一样的包名,就编译通过了
对于上面的GrandFather,Father,son来说,如果同时需要一个Junit的jar包,就需要在三个pom.xml都配置Junit依赖。但显然,Maven不会这么傻,Maven有自己的继承机制
只有一个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>com.maven</groupId> <artifactId>fatherBase</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> //重要 <name>fatherBase</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.maven</groupId> <artifactId>fristItemSon</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> </project>
为了演示,就不写两个测试source folder了。
其中FatherBaseExtends这个简单定义如下:
//直接使用了Son中的类 public class FatherBaseExtends { public void say(){ Son son=new Son(); son.sonSay(); } }
<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.maven</groupId> <artifactId>fatherBaseExtends</artifactId> <version>0.0.1-SNAPSHOT</version> <name>fatherBaseExtends</name> //这里是核心,使用parent标签,继承FatherBase项目 <parent> <groupId>com.maven</groupId> <artifactId>fatherBase</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
FatherBase与两个最基础的包(Son与Junit)依赖,让FatherBaseExtends直接继承FatherBase,就能使用Son和Junit中的类,这样Junit这样的每个类都需要使用时,直接继承即可。
例子:Son提供了基本方法实现,Father中要使用时,直接在Father的pom.xml中依赖Son即可。GrandFather中调用Father时,直接在GrandFather的pom.xml中依赖Father即可,尽管Father使用了Son方法,但因为依赖的传递性,GrandFather依赖Father的同时,也依赖了Father依赖的包。
例子:当要想给Son,Father,GrandFather都使用Junit项目时,我们把Son和Junit进行了封装,也就是创建一个BaseSon项目,不写任何包,仅仅定义一个pom.xml来表示该项目依赖了Son与Junit。Father仅仅继承BaseSon即可调用Son中的方法,也可以使用Junit
我们Maven中的依赖或者继承,都是Maven去仓库中寻找我们要使用的jar包,那么Maven怎么就通过pom.xml文件找到了,pom.xml中的配置到底传给Maven什么信息?
下面的配置就是Maven用来定位jar包所在地方的坐标
<groupId>com.maven</groupId> <artifactId>fatherBaseExtends</artifactId> <version>0.0.1-SNAPSHOT</version>
通过这三个标签,Maven会从com.maven.fatherBase.Extends.0.01-SNAPSHOT下去寻找所需要的jar包
maven就是根据坐标从仓库中寻找jar包,groupId,artifactId,version一个都不能缺少。
并且我们项目的pom.xml文件发布到仓库的类库时,就变成了.pom文件。我们通过.pom文件就可以找到依赖的jar包的详细位置
本地仓库:之前在setting.xml配置的了我们的本地仓库,当然也有默认的本地仓库
中央库:Maven默认的远程仓库,http://repo1.maven.org/maven2
私服:用来代替中央库,比中央库要快
pom.xml:Maven工程都要有该文件,该文件记录了依赖包的坐标
项目对象模型:Maven把pom.xml变为项目对象模型
依赖管理模型:从三个仓库寻找依赖包
Plug-in:之前的命令"mvn install/clean/compile..."能运行,就是因为/Users/mvn_repository/org/apache/maven/plugins该文件的存在,如果你删除了该文件,当你在命令行输入"mvn compile/clean/.."这些操作的时候,MAVEN会先联网下载plugins文件,然后才会执行其功能,可以看出,该文件的重要性。
打开preference。找到
installations:eclipse自带的maven,我们要导入自己下载的maven
User Settings(*):默认路径是.m2下的文件。我们要使用下载下来maven中config的settings.xml。Eclipse会自动查看xml文件中我们配置的库路径。
配置完毕后就针对我们指定的库开始进行操作了。
其中下拉框中的内容就是MAVEN的骨架,当你选择后,eclipse会自动生成一些东西,然后一直next,输入artifactID与gourpID后,就自动成了Maven项目,也就是项目左上角有个m
此时我们看到只有两个source folder。一个main,一个test。
此时可以再创建两个resources,用来存放一些资源配置。就和之前的方式一样
其中Maven Dependencies就是Maven的依赖库,当你修改pom.xml中的依赖时,他会自动变化。
我们发现没有"mvn compile"。所以我们要使用的“maven build”命令
,在里面输入"compile"。点击run就ok了。
www. zuidaima .com/blog/2732824092625920.htm
为详细步骤
标签:
原文地址:http://www.cnblogs.com/xingdongpai/p/5202569.html