MAVEN基础入门

未分类 一条评论


maven简介


maven是基于项目对象模型(pom),可以通过一小段描述信息来管理项目的构建,文档和报告的软件项目管理工具。

maven 安装


安装JDK,配置java环境变量:略
下载maven包,下载地址:http://maven.apache.org/download.cgi#
注意maven的版本号需要和jdk版本兼容,当jdk版本低,而Maven的版本高时,会报错:
“Exception in thread “main” java.lang.UnsupportedClassVersionError:org/apache/maven/cli/MavenCli:Unsupported major.minor version 51.0”
配置maven环境变量: 解压包,配置path: 添加指向解压目录下的bin目录,即$M2_HOME/bin 或者 新增系统环境变量M2_HOME指向解压的目录
校验配置: 在命令行执行 mvn -v如果能够现实maven和java版本号,则配置成功

本地仓库的配置


和settings.xml这个文件有关。这个文件存在于两个地方:

  • maven的安装目录:$M2_HOME/conf/settings.xml
  • 用户目录:${user.home}/.m2/settings.xml
    前者是全局配置,后者是用户配置。两者配置将会进行合并,当两者有冲突时,用户配置优先生效。

本地仓库的配置,修改settings.xml:

 <localRepository>C:\mvn\repos</localRepository>

这个配置将会将依赖库都下载存放在本地的C:\mvn\repos中

maven项目代码结构


maven项目代码结构:

    src
        main
            java
                com.company.xxx(包名)
                - 项目开发代码
            resources
                - 开发资源文件
        test
            java
                com.company.xxx(包名)
                    - 项目的测试代码
            resources
                -测试资源文件
    pom.xml

  • 在eclipse中安装maven插件(新版本的eclipse已自带maven)后,直接新建maven project 则会将对应上述目录结构创建出来(包除外)
  • 另外一种创建maven目录结构的方法是使用maven命令:
    mvn archetype:generate (交互式) 或者
    mvn archetype:generate
    -Dgroup=xxx -DartifactId=xxx -Dversion=xxx -Dpackage=xxx (非交互式)
    执行完成后,将会在当前命令行所在的目录下创建上述maven 代码结构

maven常用命令


mvn -v 查看maven版本
mvn compile 编译
mvn test 测试
mvn package 打包
mvn clean  删除maven在target中所生成的字节码文件
mvn install 安装jar包到本地仓库中,以便其他的项目可以调用
mvn deploy 运行发布,发布到私服上

组合使用:

mvn clean compile 表示先运行清理之后运行编译,会见代码编译到target文件夹中
mvn clean test 运行清理和测试
mvn clean package 运行清理和打包
mvn clean install 运行清理和安装
mvn clean deploy 运行清理和发布(发布到私服上面)

配置pom.xml


常用标签

pom.xml是maven配置的核心文件,用来描述项目信息,组织依赖,项目管理,其中包含很多标签

<project>
    <modelVersion>4.0.0</modelVersion>
    <!--maven2.0必须是这样写,现在是maven2唯一支持的版本-->
    <!-- 基础设置 -->
    <modelVersion>4.0.0</modelVersion>  指定了当前pom的版本
    <groupId>cn.itcast.hadoop.mr</groupId> 用来指定当前的maven属于哪个实际的项目
    <artifactId>datacount</artifactId>  
    <version>0.0.1-SNAPSHOT</version> 当前项目的版本号
    <packaging></packaging> 打包方式,默认是jar
    <name></name>项目描述名
    <url></url>项目的地址
    <description></description>项目描述
    <name>...</name>
    <repositories></repositories>配置依赖包从什么中央仓库进行下载
    <dependencies>...</dependencies> 项目的依赖
    <parent>...</parent>  被继承的父项目的构件
    <dependencyManagement>...</dependencyManagement>  缺省的依赖信息将会从这个元素中继承
    <modules>...</modules> 模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 
    <properties>...</properties> 以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件

</project>

maven依赖管理

pom.xml中依赖的配置形如:

<dependencies>
  <dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-core</artifactId>  
    <version>${springframework.version}</version>  
    <type>jar</type>  
    <scope>compile</scope>  
    </dependency>
</dependencies>

说明:
groupId,必选,实际隶属项目
artifactId,必选,其中的模块
version, 必选,版本号
type, 可选,依赖类型,默认jar
scope, 可选,依赖范围,默认compile
optional, 可选,标记依赖是否可选,默认false
exclusion, 可选,排除传递依赖性,默认空

依赖的范围
其中 scope代表依赖的范围,取值有6种:
compile:默认的范围,编译测试运行都有效
provided:只在编译测试时有效,在实际打包时不会放进去,例如servlet-api.jar包,在web服务器tomcat的lib中已经自带,再打包进去可能会引起冲突,这时使用provided不会将该包打包
test:只在测试时有效
runtime:在测试和运行时有效
system:与本机系统相关联,可移植性差
import:导入的范围,它只使用在dependencyManagement中,表示从其它的pom中导入dependency的配置。

依赖的传递性
所谓依赖的传递性,A依赖于B,B依赖于C ,可以推出 A依赖于C,需要注意这种依赖的传递性只在compile范围进行。即A ,B,C的scope都是compile

依赖的搜索
maven搜索依赖时会先搜索本地仓库即settings.xml中localRepository配置的仓库,如果本地仓库没有再搜索中央仓库,即pom.xml中repositories配置的仓库

依赖冲突和查询
存在多个模块依赖不同版本的包时,会存在依赖冲突,此时maven并不会报错,而是根据一定规则选用一个依赖包来生效。规则:

在同一个pom.xml文件中配置了同一个包的不同版本,谁配置在前面,则谁生效
不同模块之间的依赖关系短路优先,优先解析路径短的生效.

此外,可以使用exclusion标签来排除该依赖:

<dependency>
    <groupId>com.company.xxx</groupId>  
    <artifactId>xxx-xxx</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>    
        </exclusion>
    </exclusions>
</dependency>

maven聚合

创建一个新的maven 项目专门用于将多个子模块进行整合一次性构建,不再单独对每个子模块独立构建,这种整合构建的方式就是maven的聚合,pom.xml中聚合的配置:

<project>  

    <modelVersion>4.0.0</modelVersion>  
    <groupId>com.company.xxx</groupId>  
    <artifactId>xxx-aggreation</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging> pom </packaging>  <!-- 这里必须是pom-->
    <name>xxx Aggregator</name>  
     <modules>  
        <module>../xxx-module1</module>  
        <module>../xxx-module2</module>  
     </modules>  

</project>

注意事项: 由于聚合的maven项目和各个子项目是对等的,所以再聚合项目中module的配置一定是 ../子模块的格式

maven继承

两个不同的模块之间pom.xml的可以存在继承关系
父模块配置:

<project>  
    <modelVersion>4.0.0</modelVersion>  
    <groupId>com.company.xxx</groupId>  
    <artifactId> xxx-parentmodule </artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
    <name> xxx-parentmodule</name>  

    <dependencyManagement> <!--默认被子模块继承的依赖-->

        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.1.1</version>
            </dependency>

    </dependencyManagement>
</project>

子模块的配置:

<project>  
    <modelVersion>4.0.0</modelVersion>    
    < parent >  
        <groupId>com.company.xxx</groupId>  
        <artifactId> xxx-parentmodule </artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        < relativePath >../xxx-parentmodule/pom.xml</ relativePath>  <!--这里需要指明父模块pom.xml的位置,使用相对路径-->
    </ parent >  

    <artifactId> xxx-sonmodule </artifactId>  
    <name>xxx-sonmodule</name>  
  ...  
</project>

由于maven的聚合项目只在pom.xml中加入要聚合的各个子模块的信息,没有任何项目代码,而pom.xml中父模块中的配置往往也是为了让其他子模块有选择性的继承。这两者往往会合并,都放在一个pom.xml文件中,成为这样的形式:

<project>  
    <modelVersion>4.0.0</modelVersion>  
    <groupId>com.company.xxx</groupId>  
    <artifactId>xxx-parentmodule</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging> pom </packaging>  
    <name>xxx-parentmodule</name>  

    <modules>  
        <module>../xxx-sonmodule1</module>   
        <module>../xxx-sonmoudule2</module>  
    </modules>  

</project>

注意:

- 如果子模块没有声明groupId和version, 这两个属性继承至父模块。但如果子模块有不同与父模块的 groupId、version ,也可指定;

- 不应该继承artifactId,如果groupId ,version,artifactId 完全继承的话会造成坐标冲突;另外即使使用不同的 groupId或version,同样的 artifactId也容易产生混淆。

1条评论

moluu says: 回复

很棒

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *