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  OS X下安装

    第一步,下载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.1  windows下安装

    第一步:下载MVN

     这里选择了Binary zip archive对应的apache-maven-3.3.9-bin.zip进行了下载

    第二步:配置系统环境变量

     1.%MVN_HOME%="...."

     2.PATH="%MVN_HOME%in;......"

    第三步:mvn -v测试是否配置成功

   2.2  建库

        不论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与三大框架整合

  9.1 把Maven project转换成Dynamic web project

    第一步:创建Maven工程

      1.在eclipse的菜单栏选择File->New->Other->Maven->Maven Project        

      2.下一步后选择Create a simple project(skip archetype selection),如图

      

      3.下一步后输入Group Id,Archive Id,Packaging后点击Finish,如图 

       

      4.创建成功后的文件目录,如图

      

    第二步:把Maven project转换为java的Dynamic Web project

      1.右键点击Project的名称,选择Properties

      2.左边选择Project Facets

      3.勾选

      

    最后点击Properties for showcase的OK完成转换,最后的目录结构,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    第三步:修改Java Build Path

      1.右键点击Project的名称,选择Properties

      2.选择Java Build Path,将JRE 1.5版本Remove掉,然后点击Add Library,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

      3.选择JRE System Library,点击Next,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

      4.选择你设置的jdk6版本,点击Finish,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

      5.最后点击OK,完成设置,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    四.修改Java Compile

      1.右键点击Project的名称,选择Properties

      2.选择Java Compiler,并选择Compiler compliance level为1.6,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    五.修改Deployment Assembly

      1.右键点击Project的名称,选择Properties

      2.选择Deployment Assembly,并点击Add,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    3.选择Java Build Path Entries,点击Next,如图

       如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    4.选择Maven Dependencies,点击Finish,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project 

    5.最好点击OK,完成设置,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    六.设置Server Apache Tomcat

      1.菜单栏选择Window->Show View->Servers

      2.点击new server wizard,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project 

      3.选择Tomcat v6.0 Server,点击Next,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    4.选择Browse,选择正确的Apache Tomcat的安装目录,然后点击Next,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    5.选择要部署的项目如showcase,然后点击Add,点击Finish,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    注意:

      在Add and Remove的时候提示这个:Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules  如何在eclipse jee中创建Maven project并且转换为Dynamic web project

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    6.完成设置后的项目如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    7.在Servers View上双击Tomat v6.0 Server at localhost[Stopped Republish],如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    8.修改项目的部署目录为Tomcat installtion目录,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    9.修改项目的访问路径,即去掉比如http://localhost/showcase/目录中的showcase,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    10.关掉Auto reloading enabled,这样不用每次修改文件就自动部署,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    11.右键点击Tocmat v6.0 Server at localhost[Stopped Republish],点击Clean即可完成web project的部署,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    12.最后在Tomcat的目录部署成功,如图

      如何在eclipse jee中创建Maven project并且转换为Dynamic web project

原文地址:https://www.cnblogs.com/xingdongpai/p/5202569.html