本博目录:

很早就在项目中接触过Maven,但对Maven没有很深入的了解,犹如《西游记》中五庄观偷吃人参果的猪悟能,囫囵吞食,不知其味。在拜读了《Maven 实战》之后,对Maven有了一定的了解,特记录一些知识如下。

一、 什么是Maven?

Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven作为跨平台的项目管理工具,最重要的用途—->”服务于构建”,能够帮助我们自动化构建过程,从清理、编译、测试到生成报告、再到打包和部署。

二、 Maven的安装及配置

Maven的安装教程,自己可百度安装即可,在这就不赘述了。apache-maven-3.1.0/conf目录中有一个settings.xml文件,我们来剖析下Maven配置文件settings.xml,内容如下代码:

 <?xml version="1.0" encoding="UTF-8"?>
<settings
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"
    xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<!--̹本地仓库地址-->
    <localRepository>C:\chao\repository</localRepository>

<!--servers配置认证信息,如下表示:连接id为nexus-snapshots的远程仓库的用户名和密码-->
    <servers>
     <server>  
        <id>nexus-snapshots</id>  
        <username>swc</username>  
        <password>swc123</password>  
    </server> 
     <server>  
        <id>nexus-releases</id>  
        <username>swc</username>  
        <password>swc123</password>  
    </server>
    <server>
        <id>tomcat7</id>
        <username>swc</username>
        <password>swc</password>
    </server>

    <!-- 结合私服,使用镜像代替中央仓库-->
   <mirrors>
        <mirror>
            <id>nexus</id>
            <mirrorOf>*</mirrorOf><!-- 匹配所有远程仓库-->
            <name>internal nexus repository</name>  
            <url>http://loaclhost:8081/nexus/content/groups/public/</url>           
        </mirror>
    </mirrors>  
    <proxies>

   <!-- 公司设置代理上网,就要在此配置HTTP 代理-->
        <proxy>
            <id>petrochina</id>
            <active>true</active><!-- 激活代理-->
            <protocol>http</protocol>
            <host>10.22.96.29</host>
            <port>8080</port>
            <nonProxyHosts>10.*|*.com|*.cnpc|*.local</nonProxyHosts>
            <!--
            <username></username>
            <password></password>
            -->
        </proxy>
    </proxies>
</settings>

(附:Maven安装包下载地址:http://pan.baidu.com/s/1qYG8jEk

三、 Maven详解

Maven项目中默认的主代码目录是src/main/java,默认的测试代码目录是src/test/java,任何一个maven项目都需要定义自己的坐标,当这个maven项目作为其他maven项目的依赖时,这组坐标就体现了其价值,。

3.1 Maven坐标

Maven定义了这样一组规则:世界上任何一个构件(任何一个依赖、插件或者项目构建的输出,都称之为构件)都可以使用Maven坐标唯一标示。Maven坐标的元素包括:groupId、artfactId、version、packaging、classifier。例如下面就是Mysql驱动的坐标:

       <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.31</version>
        </dependency>

参数说明:
groupId:定义当前Maven项目隶属的实际项目
artfactId:该元素定义实际项目中的一个Maven项目
version:该元素定义Maven项目当前所处的版本
packaging:该元素定义Maven项目的打包方式,(jar或war)默认是jar
classifier:该元素用来帮助定义构建输出的一些附属构件

3.2 maven依赖

一个依赖声明可以包含以下一些元素:

<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>...</modelVersion>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <name>...</name>
    <packaging>...</packaging>
    <description>...</description>

    <dependencies>
        <dependency>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <scope>...</scope>
            <optional>...</optional>
            <exclusions>
                <exclusion>
                    <groupId>...</groupId>
                    <artifactId>...</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
</project>

参数说明:
groupId、artfactId和version是Maven坐标的基本元素
type:依赖的类型
scope:依赖的范围。依赖范围就是用来控制依赖与(编译classpath、测试classpath、运行classpath的关系,包括compile、test、provided、runtime、system、import。 Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。
optional:标记依赖是否可选。
exclusions:用来排除传递性依赖。

3.3 maven仓库

Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。

对于Maven来说,仓库可以分为两类:本地仓库和远程仓库,如图所示。当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库有此构件,则直接使用;如果没有,或者需要查看是否有更新的构件版本,Maven就会到远程仓库查找,找到构件下载到本地再使用。

这里写图片描述

中央仓库是Maven核心自带的的远程仓库。

私服是一种特殊的远程仓库,是在局域网内架设私有的仓库服务器。用其代理所有外部的远程仓库,供局域网内的Maven用户使用,从而降低中央仓库的负荷。

3.3-1 远程仓库的配置
    <repositories>
        <repository>
            <id>nexus-snapshots</id>
            <name>Nexus</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>            
            <releases>
                <enabled>true</enabled>
                <updatePolicy>daily</updatePolicy>
                <checksumPolicy>ignore</checksumPolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

参数说明
releases的值为true,表示开启Nexus仓库的发布版本下载支持
snapshots的值为true,表示开启Nexus仓库的快照版本下载支持
updatePolicy配置从远程仓库检查更新的频率,有never/always/interval:x,默认是daily
checksumPolicy配置Maven检查检验和文件的策略,其值为:warn/fail/ignore,默认是warn。

3.3-2 远程仓库的认证

大部分远程仓库无须认证就可以访问,但出于安全考虑,我们需要提供认证信息才能访问一些远程仓库。Maven使用settings.xml文件中的server元素配置仓库认证信息。

    <servers>
     <server>  
        <id>nexus-snapshots</id>  
        <username>swc</username>  
        <password>swc123</password>  
    </server> 
     <server>  
        <id>nexus-releases</id>  
        <username>swc</username>  
        <password>swc123</password>  
    </server>
    <server>
        <id>tomcat7</id>
        <username>swc</username>
        <password>swc</password>
    </server>
    </servers>
3.3-3 部署到远程仓库

Maven除了能对项目进行编译、测试和打包之外,也可将项目生成的构建部署到仓库中。在pom文件中配置如下,在命令行运行mvn clean deploy Maven就会将项目构建输出的构建部署到配置对应的远程仓库。

    <distributionManagement>
        <repository><!--发布版本构件的仓库 -->
            <id>nexus-releases</id>
            <name>Nexus Release Repository</name>
            <url>http://localhost:8081/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository><!--快照版本构件的仓库 -->
            <id>nexus-snapshots</id>
            <name>Nexus Snapshots Repository</name>
            <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

3.4 Maven生命周期和插件

3.4-1Maven生命周期

Maven的生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤,生命周期是抽象的,不做任何实际的工作,都交由插件来完成。

这里写图片描述

Maven拥有三套相互独立的生命周期:clean(清理项目)、default(构建项目)、site(建立项目站点)。在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行。
clean生命周期一共包含了三个阶段:

pre-clean  执行一些clean之前完成的工作
clean  清理上一次构建生成的文件
post-clean  执行一些clean之后完成的工作

Maven的最重要的default生命周期,绝大部分工作都发生在这个生命周期中。

validate
initialize
generate-sources
process-sources
generate-resources 

process-resources     
#处理项目主资源文件,一般来说,是对src/main/resources目录内容复制到项目输出的classpath目录中。
compile    
# 编译项目的源代码。一般来说,是编译src/main/java目录下的java文件至项目输出的classpath目录中。

process-classes 
generate-test-sources 

process-test-sources  
#处理项目测试资源文件一般来说,是对src/test/resources目录内容复制到项目输出的classpath目录中。
generate-test-resources

process-test-resources     
#复制并处理资源文件,至目标测试目录。
test-compile     
#编译测试源代码。一般来说,是编译src/test/java目录下的java文件至项目输出的classpath目录中。
process-test-classes 

test     
#使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package     
#接受编译好的代码,打包成可发布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify 

install     
#将包安装至Maven本地仓库,供本地其它项目依赖。
deploy     
#将最终的包复制到远程仓库,以让其它开发人员与项目共享。

Site生命周期的各个阶段:

pre-site     执行一些需要在生成项目站点之前完成的工作
site    生成项目的站点文档
post-site     执行一些需要在生成项目站点之后完成的工作,并且为部署做准备
site-deploy     将生成的项目站点部署到特定的服务器上
3.4-2Maven插件

在pom文件中配置插件仓库,

    <pluginRepositories>
        <pluginRepository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

添加插件配置

    <build>      <!-- 插件列表 -->
        <finalName>${project.name}</finalName>
        <plugins>
            <!-- compiler插件, 设定JDK版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>false</showWarnings>
                    <showDeprecation>false</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.2.1.v20140609</version>
                <configuration>
                    <httpConnector>
                        <port>8080</port>
                    </httpConnector>
                    <webAppConfig>
                        <contextPath>/${project.name}</contextPath>
                    </webAppConfig>
                </configuration>
            </plugin>
        </plugins>
    </build>

四 、maven常用命令

mvn dependency:list 了解项目中所有依赖的基本信息
mvn dependency:tree 生成依赖树,查看依赖信息。
maven clean:清理上一次构建生成的文件。
mvn test 运行测试
mvn compile 编译项目
mvn deploy:将项目构建输出的构件部署到配置对应的远程仓库。
mvn install 将项目的构建输出文件安装到本地仓库。
mvn package -Dmaven.test.skip=ture 打包时跳过测试

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐