Maven
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven相关的知识,希望对你有一定的参考价值。
一 什么是Maven
Maven发展起来的原因是,随着项目的扩大,项目经理每天都需要把svn上提交的代码,进行测试功能。如果测试一个功能要5分钟,如果有20个人的代码量,那么显然,并且每个人提交的代码不仅一个功能,那么显然项目经理啥都不用干了,天天测试代码,我们说的规模还不是特别大,如果再大点,显然项目经理面临着不可完成的任务。
Maven一个命令,就可以让工程,编译,测试,报告,打包,部署。如果没有Mavan,我们需要把svn项目checkout下来后,写测试类,使用单元测试,放到服务器中,通过浏览器来测试。显然Maven就是这么一个项目管理工具。
1.1 Maven的生命周期
清理 -> 编译 -> 测试 -> 报告 -> 打包 -> 部署
1.2 企业用Maven解决的核心功能
管理jar包
1 Maven自动管理jar包,你不再需要记住struts2,spring4,hibernate要使用哪些jar包,以后,都是maven帮助导入jar包。
2 如果几个项目类似于迭代开发,显然要每次都拷贝之前项目的jar放入当前项目下,有了maven,你也不必在做这些工作。
3 解决项目中相同插件有相同jar包,或者项目中jar包冲突问题。
二 Maven的安装与配置
2.0 前提
Maven的使用必须是jdk1.6版本以上。
2.1 安装
第一步,下载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.成功页面
2.2 建库
repository(Mvn仓库):
不论project1,project2,project3分别需要哪些各自的jar包,都会从Maven仓库中去引用要用的jar包。显然Maven仓库存放了大量的jar包,加入你要做一个s2sh项目,那么仓库中就要有s2sh的所有jar包,之后当你开发s2sh项目的时候,只需要引入仓库中的jar包就ok了,
2.2.1 创建文件夹
现在创建你自己的Maven仓库,也就是你以后要开发项目时,从这个你创建Maven仓库中去寻找jar包,我自己在/Users路径下创建了一个"mvn_repository"文件。
2.2.2 setting.xml
你创建了Mavan仓库后,需要告知Maven啊,原本Mavan给你提供了默认的Mavan仓库,既然我们创建了自己的,所以我们需要修改默认值。那么在哪里修改呢
在你下载的Mavan工具中,config目录下的有一个setting.xml文件,修改下列的路径。
<localRepository>/Users/mvn_repository</localRepository>
2.3 maven约定
我们现在要利用Maven来管理项目,那么显然你要符合Mavan的约定,约定指的是你创建source folder的名字
class path下有以下几个文件:
src/main/java:存放项目的java文件
src/main/resource:存放项目的资源文件,如spring,hibernate的配置文件
src/test/java:存放所有测试文件
src/test/resource:存放测试用的资源文件
target:项目输出位置
pom.xml:当要从仓库中寻找jar包的时候用到的文件,但仅仅不只这一个功能。
三 第一个MVN项目
第一步:创建一个工项目,按照maven约定来创建文件。
第二步:创建一个简单类Son,与一个测试类SonTest
public class Son { public void sonSay(){ System.out.println("我是儿子"); } } -------------------------------- public class SonTest { public static void main(String[] args) { Son son=new Son(); son.sonSay(); } }
第三步:写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>fristItemSon</artifactId> <version>0.0.1-SNAPSHOT</version> <name>fristItemSon</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
第四步:打开Terminal,cd到Son项目下,使用"mvn compile"命令进行编译,想想之前配置了一个环境变量,此处才能使用"mvn"命令。
【注意】 一定要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文件。也就是项目输出位置
四 MAVEN的一些常用命令
4.0 mvn生命周期
清理 -> 编译 -> 测试 -> 报告 -> 打包 -> 部署
4.1 mvn clean
清理:mvn clean后,reflush项目,发现target文件没有了。输出文件被删除了
4.2 mvn compile
编译:之前我们使用过了该命令
4.2 mvn test
测试:可以看到Mavan帮我们运行了src/test/java下的文件。并把测试后的一些信息打印到了Termianl。
4.3 mvn package
打包:看到target文件中生成了一个jar包
其中名字是根据pom.xml中生成的
4.4 mvn install
把当前项目放入到Maven的类库中,你可以从你的Maven仓库中找到这个项目
4.5 关于报告
你可以从生成的target中的surefire-reports文件中看到,文件下有以下两个文件。
com.dyp.maven.SonTest.txt是测试报告
TEST-com.dyp.maven.SonTest.xml是系统级的一些参数。
【牢记】
无论你执行了Mavan生命周期的第几个步骤,Mavan会自动执行他之前的步骤。比如当你输入"mvn test"的时候,Mavan会把"mvn clean -> mvn compile"都执行了。
五 MAVEN依赖
5.1 先看一个项目
创建Father项目,这个项目中我们用之前创建的Son项目中的类
第一步:创建Father项目
第二步:创建简单类Father和测试类FatherTest
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(); } }
第三步:写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>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>
第四步:打开Terminal,cd到Father项目下,使用"mvn compile"命令进行编译
如果你报了下面错误,那就是因为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项目中的了
5.2 Maven的依赖传递性
5.2.1 再通过一个项目,深入了解依赖传递性
第一步:创建GrandFather项目
第二步:创建GrandFather简单类和GrandFatherTest类
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(); } }
第三步:修改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>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引入类,所以我写了和简单类一样的包名,就编译通过了
5.2 Maven中的jar包的继承管理
对于上面的GrandFather,Father,son来说,如果同时需要一个Junit的jar包,就需要在三个pom.xml都配置Junit依赖。但显然,Maven不会这么傻,Maven有自己的继承机制
5.2.1 通过项目来看
第一步:创建一个用来被继承的项目,该项目依赖了Son和Junit包
只有一个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>
第二步:创建继承类,直接继承上面的FatherBase项目
为了演示,就不写两个测试source folder了。
其中FatherBaseExtends这个简单定义如下:
//直接使用了Son中的类 public class FatherBaseExtends { public void say(){ Son son=new Son(); son.sonSay(); } }
第三步: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>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这样的每个类都需要使用时,直接继承即可。
5.3 Maven对包的管理总结
依赖:(类似于java中的引用)
例子:Son提供了基本方法实现,Father中要使用时,直接在Father的pom.xml中依赖Son即可。GrandFather中调用Father时,直接在GrandFather的pom.xml中依赖Father即可,尽管Father使用了Son方法,但因为依赖的传递性,GrandFather依赖Father的同时,也依赖了Father依赖的包。
继承:(类似于java中的继承)
例子:当要想给Son,Father,GrandFather都使用Junit项目时,我们把Son和Junit进行了封装,也就是创建一个BaseSon项目,不写任何包,仅仅定义一个pom.xml来表示该项目依赖了Son与Junit。Father仅仅继承BaseSon即可调用Son中的方法,也可以使用Junit
六 maven的坐标
我们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包
6.1 总结
maven就是根据坐标从仓库中寻找jar包,groupId,artifactId,version一个都不能缺少。
并且我们项目的pom.xml文件发布到仓库的类库时,就变成了.pom文件。我们通过.pom文件就可以找到依赖的jar包的详细位置
七 Maven仓库
本地仓库:之前在setting.xml配置的了我们的本地仓库,当然也有默认的本地仓库
中央库:Maven默认的远程仓库,http://repo1.maven.org/maven2
私服:用来代替中央库,比中央库要快
八 MAVEN的原理
pom.xml:Maven工程都要有该文件,该文件记录了依赖包的坐标
项目对象模型:Maven把pom.xml变为项目对象模型
依赖管理模型:从三个仓库寻找依赖包
Plug-in:之前的命令"mvn install/clean/compile..."能运行,就是因为/Users/mvn_repository/org/apache/maven/plugins该文件的存在,如果你删除了该文件,当你在命令行输入"mvn compile/clean/.."这些操作的时候,MAVEN会先联网下载plugins文件,然后才会执行其功能,可以看出,该文件的重要性。
八 MAVEN与Eclipse的整合
第一步:Eclipse可能有自带Maven,不过不管他有没有自带的,我们都要用自己下载的Maven
打开preference。找到
installations:eclipse自带的maven,我们要导入自己下载的maven
User Settings(*):默认路径是.m2下的文件。我们要使用下载下来maven中config的settings.xml。Eclipse会自动查看xml文件中我们配置的库路径。
配置完毕后就针对我们指定的库开始进行操作了。
第二步:开始创建eclipse工程,
其中下拉框中的内容就是MAVEN的骨架,当你选择后,eclipse会自动生成一些东西,然后一直next,输入artifactID与gourpID后,就自动成了Maven项目,也就是项目左上角有个m
此时我们看到只有两个source folder。一个main,一个test。
此时可以再创建两个resources,用来存放一些资源配置。就和之前的方式一样
其中Maven Dependencies就是Maven的依赖库,当你修改pom.xml中的依赖时,他会自动变化。
第三步:
我们发现没有"mvn compile"。所以我们要使用的“maven build”命令
,在里面输入"compile"。点击run就ok了。
九 Maven与三大框架整合
www. zuidaima .com/blog/2732824092625920.htm
为详细步骤
以上是关于Maven的主要内容,如果未能解决你的问题,请参考以下文章
什么是maven与maven的使用过程(例如在idea创建maven工程(重点讲讲idea创建使用maven管理的web工程,并且部署到tomcat上))