一、 简介:

    1. 下载maven,配置path

    2. 修改本地仓库位置,修改maven目录下的conf中的setting.xml,增加如下内容localRepository配置,例如:<localRepository>D:\maven\Repository</localRepository>

    3. maven 配置说明:

      groupId:  当前Maven项目隶属的实际项目,可以是域名反向,一般用项目名称来表示

      artifacId:  该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名-模块名称来表示

      version:  当前版本

      packaging:定义Maven项目的打包方式。首先,打包方式通常与所生成构件的文件扩展名对应。jar包和war包会使用不同的命令,当不定义packaging的时候,默认使用jar

     4. 代码和资源存放位置:       

        源代码应该放置到src/main/java中

        源代码的资源文件应该放置在src/main/resources文件夹中

        测试代码应该放置到src/test/java中

        测试代码的资源文件应该放置在src/test/resources文件夹中

    5. mvn 常用命令:       

        mvn clean -->表示运行清理操作(会默认把target文件夹中的数据清理)

        mvn clean compile-->表示先运行清理之后运行编译,会见代码编译到target文件夹中

        mvn clean test-->运行清理和测试

        mvn clean package-->运行清理和打包

        mvn clean install-->运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用

        mvn clean deploy-->运行清理和发布(发布到私服上面)

    6. maven 项目生成方式:

         1). mvn archetype generate可以自动完成这个骨架的建立

         2). 使用eclipse开发maven项目

              a). 配置本地自定义maven路径:

                   

maven main 主函数无法执行_开发工具

                    

maven main 主函数无法执行_java_02

                  b). 右键 -- > new -- > maven project ,然后可以根据需求创建需要的maven项目

                       aa). 在New Maven Project 对话框中选择:create a simple project ,创建一个简单的项目,不包括项目目录。

                       bb). 下一步,catalog选择Internal 。Artifact Id 选择maven-archetype-quickstart创建一个简单的java项目,

                              选择maven-archetype-webapp创建一个简单的web项目。             

 

          The folder is already a source folder处理方式:右键build path -> configure build path -> source ,选择 src/main/java、src/test/java删除,然后再新建。

 

 

二、依赖

       我们项目中依赖的 Jar 包可以通过依赖的方式引入,通过在 dependencies 元素下添加 dependency 子元素,可以声明一个或多个依赖。通过控制依赖的范围,

       可以指定该依赖在什么阶段有效。

1. 依赖包的查询:

    1). 所有的依赖都是通过坐标来进行存储的(GAV : groupId , artifactId , version )

    2). 有一些网上的仓库提供了坐标的查询(http://mvnrepository.com/)

    3). 通过<dependencies>设置依赖:            



<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
     </dependencies>



         maven是如何搜索依赖的?首先会在本地仓库查询如果本地仓库没有,就去中央仓库查询

2. 依赖会被传递:

    A-->C  B-->A ==> B-->C(这种依赖是基于compile这个范围进行传递)

    

maven main 主函数无法执行_java_03

    对于依赖的传递而言,主要是针对compile作用域传递

3. 依赖传递的冲突问题:

    1). a-->b1.0 c-->b1.1 d-->a和c,这个时候在d的pom中,哪一个依赖先写就使用先写依赖的版本,如果d--><d>a</d><d>c</d>-->依赖版本是b1.0

    2). a-->b1.0 c-->b1.1 d-->a和c-->b1.0 f-->d,c,如果路径的长短不一致就选择最小路径 , f-->b1.1

    3). 如果希望精确的控制依赖包,可以使用依赖的排除功能进行控制

         

maven main 主函数无法执行_开发工具_04

4. 依赖的范围(scope声明):

    1). test范围指的是测试范围内有效,在编译和打包的时候都不会使用这个依赖

    2). compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去

    3). provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突

    4). runtime在运行的时候依赖,在编译的时候不依赖

    默认的依赖范围是compile

5. 聚合和继承:

    1). 聚合:现实中一个项目往往是由多个 project 构成的,在进行构建时,我们当然不想针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大

         降低效率。Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父

         POM 中。其中 <module></module> 中间的内容为子模块工程名的相对路径。例如:

         

maven main 主函数无法执行_maven_05

     2). 继承:在面向对象的编程中我们学会了继承的概念,继承是可重用行即消除重复编码的行为。Maven 中继承的用意和面向对象编程中是一致的。

          与聚合的实现类似,我们通过构建父模块将子模块共用的依赖,插件等进行统一声明,在聚合和继承同时使用时,我们可以用同一个父模块来完成这两个功能。

          父文件:

          

maven main 主函数无法执行_java_06

         子文件:

         

maven main 主函数无法执行_开发工具_07

 

      由于父模块只是用来声明一些可共用的配置和插件信息,所以它也像聚合模块一样只需要包括一个 POM 文件,其它的项目文件如 src/main/java 是不需要的。

      聚合和继承存在一些共性和潜在的联系,在实际的应用中,经常将聚合模块的父模块和继承的父模块定义为同一个。并不是所有的 POM 元素都可以被继承,下图

      是一个可继承的元素列表。

      

 

名称

描述

groupId

项目组 ID

version

项目版本

description

描述信息

organization

组织信息

inceptionYear

创始年份

url

项目的 url 地址

developers

开发者

contributors

贡献者信息

distributionManagerment

部署信息

issueManagement

缺陷跟踪系统

ciManagement

持续继承信息

scm

版本控制信息

mailingList

邮件列表信息

properties

自定义的属性

dependencies

依赖配置

dependencyManagement

依赖管理配置

repositories

仓库配置

build

源码目录,插件管理等配置

reporting

报告配置


6. 版本管理:

    总版本号.分支版本号.小版本号-里程碑版本

    总版本号的变动一般表示框架的变动

    分支版本号:一般表示增加了一些功能

    小版本号:在分支版本上面进行bug的修复

    里程碑:SNAPSHOT-->alpha-->beta-->release-->GA

    user0.0.1-SNAPSHOT-->user0.0.1-Release--->user1.0.0SHAPSHOT -->user1.0.0-Rlease

                                      -->user0.1.0-SNAPSHOT-->user0.1.0-Rlease

7.  去除依赖:

     依赖是具有传递性的,例如 Project A 依赖于 Project B,B 依赖于 C,那么 B 对 C 的依赖关系也会传递给 A,如果我们不需要这种传递性依赖,也可以用 <optional>

     去除这种依赖的传递

 



<dependency> 
         <groupId>commons-logging</groupId> 
         <artifactId>commons-logging</artifactId> 
         <version>1.1.1</version> 
         <optional>true<optional> 
 </dependency>



     假设第三方的 jar 包中没有使用 <optional> 来去除某些依赖的传递性,那么可以在当前的 POM 文件中使用 <exclusions> 元素声明排除依赖,exclusions 可以包含一个或者

      多个 exclusion 子元素,因此可以排除一个或者多个传递性依赖。        



<dependency>  
         <groupId>org.springframework</groupId>  
         <artifactId>spring-core</artifactId>  
         <exclusions>  
               <exclusion>      
                    <groupId>commons-logging</groupId>          
                    <artifactId>commons-logging</artifactId>  
               </exclusion>  
         </exclusions>  
    </dependency>