什么是Maven

相信现在很多公司基本上还是用Maven,相比于基于Goovy的Gradle,Maven到现在还是很多人的选择,虽然Hibernate已经于2010年迁移到Gradle,但是并不妨碍Maven的优秀。

Maven并不是一个POM文件,而是一个可以通过POM文件里面的信息描述来管理整个项目的构建、报告及文档的项目管理软件。

Maven常用命令

1、mvn install

这是最常用的命令,用于把项目安装到本地的仓库中,提供给别的项目做引用或作自有项目。

2、mvn clean

与上面的install起着反作用能力,当你发现项目install有问题的时候,可以先clean(清除),然后重新install。

3、mvn archetype

这个非常容易理解,我们一般都在eclipse或者idea创建maven项目的时候,可以用这个命令,就是创建一个maven项目。

4、mvn deploy

一般情况下,我们做maven项目,都会有私库的存在,就是自己在服务器上建自己的,存放jar包的仓库,这个命令就是用来把我们install好的包发布(其实就是网络传输)上去。

5、mvn site 生成项目相关信息的网站

我们一般在一个项目的时候,都是有一定信息的,这个命令可以帮我们生成html形式的项目信息,不过现在小编很少用。

6、mvn compile

compile编译的意思,其实就是编译maven项目的源代码

7、mvn test-compile

与上面的类似,不过这次编译的是测试测试包里面的源代码

8、mvn test

现在很多项目都要求做单元测试,这个命令可以帮助我们测试所有的单元测试。

9、mvn package

这是一个集成过程,它的执行顺序是先clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段,最后是成一个jar包

10、mvn eclipse

生成一个eclipse可直接导入的文件

11、mvnjetty:run与mvntomcat:run

启用jetty服务或者启动tomcat服务

12、mvn clean package -Dmaven.test.skip=true

这个是执行重新打包的命令,但是这个重新打包是不会执行测试类,因为有时候测试类并不能连接到一些环境。

Maven的POM文件解析

1、父项目parent解析
<parent>
 groupId:父项目的组织ID,如果发布到公网,需要全球唯一-->
    <artifactId />
    <groupId />
    <version />
    <relativePath />
</parent>


#artifactId:父项目的项目id,在组织id下需要作为唯一
#version:父项目的版本号
#relativePath:父项目的系统位置,一般不设置
2、当前项目基础属性解析
<!--模型的版本,很少改变,一般定义好之后不用变化-->
<modelVersion>3.0.0</modelVersion>
<!--项目组织名称,如果继承parent,其实可以不用写-->
<groupId>com.boots</groupId>
<!--项目名称,这个要求写,打包的时候需要用到-->
<artifactId>boots-maven</artifactId>
<!--项目打包后的类型,常见的有jar,pom,war等三种-->
<packaging>war</packaging>
<!--项目当前版本,常见有RELEASE,SNAPSHOT,按照约定,尽可能要大写-->
<version>2.0.0-RELEASE</version>
<!--项目的名称,一般跟artifactId一样即可 -->
<name>boots-maven</name>
<!--项目的地址,因为在做系列,小逼设置为github地址 -->
<url>h ttps://gitee.com/smartDis/boots</url>
<!-- 项目描述,这是里为了方便后面开发的兄弟知道这是做啥的  -->
<description>Maven:12个常用命令+POM文件全属性分解,让你一清二楚</description>
<!--项目构建版本的时候产生的年月 -->
<inceptionYear />
3、前置条件属性解析(很少用)
<!--当前项目需要的前置条件 -->
<prerequisites>
   <!--当前项目需要maven的最低版本-->
    <maven />
</prerequisites>
4、项目问题管理issueManagement系统属性全解析
<issueManagement>
  <!--当前项目问题管理系统的名称,这是为禅道 -->
   <system>zentao</system>
   <!--禅道的地址,这里是官网的地址,自行去搞 -->
   <url>h ttps://www.zentao.net/download/80185.html</url>
</issueManagement>
5、持续继集成ciManagement全属性解析
<ciManagement>
   <!--持续集成的名称,可用Walle,Jekins,云效等-->
   <system />
   <!--持续集成的web地址,一般有接口就填写接口 -->
   <url />
   <!--完成后通知 -->
   <notifiers>
         <notifier>
          <!--通知的类型,一般为邮件 -->
          <type />
          <!--错误时通知 -->
           <sendOnError />
           <!--失败时通知 -->
           <sendOnFailure />
           <!--成功时通知 -->
           <sendOnSuccess />
           <!--警告时通知 -->
           <sendOnWarning />
           <!--发送地址,一般是邮件地址 -->
           <address />
           <!--自定义配置项 -->
           <configuration />
     </notifier>
   </notifiers>
</ciManagement>
6、邮件列表属性mailingLists全解析
<mailingLists>
     <mailingList>
          <!--设置邮件名称 -->
          <name>林溪</name>
          <!--发送邮件地址 -->
          <post>localhost127001@126.com</post>
          <!--订阅邮件地址 -->
          <subscribe>localhost127001@126.com</subscribe>
          <!--取消订阅邮件地址 -->
          <unsubscribe>localhost127001@126.com</unsubscribe>
          <!--邮件服务器地址 -->
          <archive>h ttps://gitee.com/smartDis/boots</archive>
      </mailingList>
</mailingLists>
7、开发者列表developers及contributors属性全解析(两者属性一样,把developers换成contributors即可)
<developers>
      <developer>
         <!--开发者的唯一id-->
          <id>林溪</id>
          <!--开发者名称 -->
          <name>林溪</name>
          <!--开发者邮件 -->
          <email>localhost127001@126.com</email>
          <!--开发者主页 -->
          <url >gitee.com/smartDis/boots</url>
          <!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->
          <roles>
              <role>Developer</role>
          </roles>
          <!--开发者组织 -->
          <organization>boots</organization>
          <!--组织的url -->
          <organizationUrl>gitee.com/smartDis/boots</organizationUrl>
          <!--开发者属性 -->
          <properties>
              <dept>No</dept>
          </properties>
          <!--开发者时区,一般没啥意义,只是为了让人知道这货在什么地方 -->
          <timezone>8</timezone>
      </developer>
</developers>
8、项目licenses属性全解析
<licenses>
    <license>
         <!--license名称,具有法律意义的-->
         <name>boots</name>
         <!--license文本的告知信息地址,这个很官方 -->
         <url>gitee.com/smartDis/boots</url>
         <!--代表可以用Maven中央仓库下载,一般都是这个 -->
         <distribution>repo</distribution>
         <!--license的其他信息 -->
         <comments>我是license的其他信息</comments>
      </license>
 </licenses>
9、build全属性解析
<build>
       <!--需要编译的源码地址 -->
       <sourceDirectory />
       <!--需要执行的脚本地址,一般都是拷贝到目标目录 -->
       <scriptSourceDirectory />
       <!--需要执行测试编译的源码地址 -->
       <testSourceDirectory />
       <!--编译后存放的地址 -->
       <outputDirectory />
       <!--测试编译后存放的地址 -->
       <testOutputDirectory />
       <!--拓展构建,里面的属性跟我们刚刚最上面的属性一样-->
       <extensions>
           <extension>
               <groupId />
               <artifactId />
               <version />
           </extension>
       </extensions>
       <!--全局默认值设置 -->
       <defaultGoal />
       <!-- 资源属性,用来操作项目中类似properties等文件-->
       <resources>
           <resource>
               <!-- 打包后资源的目标地址。 -->
               <targetPath />
               <!--是否需要过滤的资源 -->
               <filtering />
               <!--原先存放资源的地址 -->
               <directory />
               <!--包含的资源的哪些文件,例如yml等 -->
               <includes />
               <!--不需要打包的资源的哪些文件,例如xml等-->
               <excludes />
           </resource>
       </resources>
       <!--测试包中资源的信息,属性与上面的一样,参考杰克 -->
       <testResources>
           <testResource>
               <targetPath />
               <filtering />
               <directory />
               <includes />
               <excludes />
           </testResource>
       </testResources>
       <directory />
       <!--打包后的文件名,会采用${artifactId}-${version}形式 -->
       <finalName />
       <!--过滤器属性文件列表 -->
       <filters />
        <pluginManagement>
           <plugins>
               <plugin>
                   <!--插件的group ID -->
                   <groupId />
                   <!--插件的artifact ID -->
                   <artifactId />
                   <!--插件的版本 -->
                   <version />
                   <!--插件的排除文件-->
                   <extensions />
                   <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
                   <executions>
                       <execution>
                           <id />
                           <phase />
                           <goals />
                           <inherited />
                           <configuration />
                       </execution>
                   </executions>
                   <!--插件的依赖 -->
                   <dependencies>
                       <dependency>
                       </dependency>
                   </dependencies>
                   <inherited />
                   <configuration />
               </plugin>
           </plugins>
       </pluginManagement>
       <!--插件的列表,属性与上面类似 -->
       <plugins>
           <plugin>
               <groupId />
               <artifactId />
               <version />
               <extensions />
               <executions>
                   <execution>
                       <id />
                       <phase />
                       <goals />
                       <inherited />
                       <configuration />
                   </execution>
               </executions>
               <dependencies>
                   <dependency>
                   </dependency>
               </dependencies>
               <goals />
               <inherited />
               <configuration />
           </plugin>
       </plugins>
   </build>
10、远程仓库repositories(一般为私库)全属性解析
<repositories>
    <repository>
       <releases>
                <!--true -->
                <enabled />
                <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
                <updatePolicy />
                <!--当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。 -->
                <checksumPolicy />
            </releases>
            <!-- 如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的 
                策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
            <snapshots>
                <enabled />
                <updatePolicy />
                <checksumPolicy />
            </snapshots>
            <!--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库 -->
            <id>banseon-repository-proxy</id>
            <!--远程仓库名称 -->
            <name>banseon-repository-proxy</name>
            <!--远程仓库URL,按protocol://hostname/path形式 -->
            <url>h ttp://192.168.1.169:9999/repository/</url>
            <!-- 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然 
                而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
            <layout>default</layout>
        </repository>
    </repositories>
11、依赖dependencies全属性解析
<dependencies>
        <dependency>
            <!--依赖的组织id -->
            <groupId>com.boots</groupId>
            <!--依赖的artifact ID -->
            <artifactId>boots-api</artifactId>
            <!--依赖的版本号 -->
            <version>1.1.0.RELEASE</version>
            <!-- 依赖的类型,默认就是jar,一般不用配置-->
           <type>jar</type>
            <!-- classifier通常用于区分从同一POM构建的具有不同内容的构件(artifact -->
            <classifier>jdk13</classifier>
            <!--依赖范围-->
            <!-- compile :默认范围,用于编译 - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
             <!-- - runtime: 在执行时需要使用 - test: 用于test任务时使用 - system: 需要外在提供相应的元素。通过systemPath来取得 
                - systemPath: 仅用于范围为system。提供相应的路径 - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
            <scope>test</scope>
            <!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。 -->
            <systemPath></systemPath>
            <!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题 -->
            <exclusions>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
            <!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。 -->
            <optional>true</optional>
        </dependency>
    </dependencies>