Maven 简单介绍

        在java世界中,工程管理是靠maven(在c/c++中是make),在研究任何一款开源软件,尤其像opendaylight这种大型开源软件,如果能够梳理清楚各个工程依赖,对于我们学习与研发会起到事半功倍的效果。由于接触maven时间不是很长,这里如果有什么不对,请各位批评指出。

一、maven环境配置

       众所周知,maven是跨平台,因此无论你把它安装在什么系统上,它都可以很好的为我们工作。由于我经常在linux环境下工作,因此在介绍maven的相关东西都是基于linux。

1、目录结构

       maven下载下来,我们通过tar命令将其解压到/usr/local/bin/目录下面,如下所示:

     

       maven的目录结构还是非常清楚与简单的。 虽然有四个目录,但是我们经常用的只有两个,那就是bin、conf目录。通过目录名字大家应该就能猜到他们作用。bin目录是存放可执行程序,也就是mvn命令行所在目录。 conf存在maven相关的配置,如本地仓库、远程仓库、代理等。boot 和 lib 分别是maven它自己所用到的库或者插件 等。

2、配置文件和可执行文件

2.1、maven配置文件

2.1.1、全局配置文件

         在conf目录下面存在一个全局配置文件,settings.xml。如果大家熟悉linux话的就能比较容易理解全局配置这个意思啦。这个文件就相当于/etc/profile文件,每个登录linux用户他们shell终端会自动继承/etc/profile文件中配置。那么这个settings.xml也是这样的,项目管理员可以为不同的项目组成员分配配置不同权限。下面我们来分析一下settings.xml文件内容。       


<!-- 本地仓库存储路径,默认为${user.home}/.m2/repository 例如:登录linux当前用户为tmp,则默认本地仓库为/home/tmp/.m2/repository -->
<localRepository>绝对路径</localRepository>

<pluginGroups>
    <!-- pluginGroup
    | Specifies a further group identifier to use for plugin lookup.
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
</pluginGroups>

<!-- 为了节省流量和方便开发,很多个公司都会创建自己的私服。此处的镜像就是为了创建私服。 -->
<mirrors>
    <mirror>
        <id>mirrorId</id>
        <mirrorOf>repositoryId</mirrorOf>
        <name>Human Readable Name for this Mirror.</name>
        <url>http://my.repository.com/repo/path</url>
    </mirror>
</mirrors>

<!-- 
连接服务器管理用户和密码,这个地方主要用版本发布和部署。
例如在pom.xml定义distributionManagement,用于发布到nexus时需要用户名和密码

-->
<servers>
    <server>
        <id>deploymentRepo</id>
        <username>repouser</username>
        <password>repopwd</password>
    </server>
</servers>

<proxies>
    <!-- proxy
    | Specification for one proxy, to be used in connecting to the network.
    | 设置代理服务器,主要用于连接网络
    <proxy>
        <id>optional</id>
        <active>true</active>
        <protocol>http</protocol>
        <username>proxyuser</username>
        <password>proxypass</password>
        <host>proxy.host.net</host>
        <port>80</port>
        <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
</proxies>

2.1.2、局部配置文件(单用户)

      就像linux用户一样,每一个用户都有一个自己shell配置文件(.bashrc),maven也是这样支持,单用户的配置。在settings.xml文件注释就有说,建议每个用户复制一份settings.xml到自己目录中(默认:/home/username/.m2目录)。这样maven就支持单用户,用户自己就可以创建自己专属的maven。

2.2、maven可执行文件

      maven的可执行文件,其实都是脚本文件,我们可以通过vi打开查看,内容比较简单,就是调用一些环境变量。下面是bin目录中内容,

      1)  其中带有.cmd是window下面的,不带.cmd则是linux下面的。

      2)  带有debug字样的文件是支持,maven自身调试用的。我们一般用不到。  mvnyjp不清楚是什么作用,基本上不用。

      3)  m2.conf 环境变量配置,maven启动会加载它。

   

二、maven常见命令行

          下面是maven常用命令行:

           mvn   compile     ---   编译工程

           mvn   packet       ---    打包(包括第一步骤)

           mvn   install        ---   安装到本地仓库(包括前两步骤)

           mvn   clean        ---   清除代码中生成的临时文件(target目录)

           mvn   test-compile           ---    编译单元测试

           mvn   test                          ---     编译并运行单元测试

          -Dmaven.test.skip=true    ---  跳过单元测试   例如: mvn install  -Dmaven.test.skip=true

三、Pom文件常见属性

          C语言中将各个工程/模块组织起来是通过makefile,那么在maven中是通过pom.xml文件组织的(POM是项目对象模型)。我们接下来会介绍一些常用属性。

<project>
    <!--   描述这个POM文件是遵从哪个版本的项目描述符。 默认是4.0.0  -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 本项目的pom文件所继承父pom文件 -->
    <parent>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
        <version>...</version>
    </parent>

    <!- The Basics   项目的基本信息->
    <groupId>经常是公司域名逆序形式</groupId>
    <artifactId>项目名称</artifactId>
    <version>项目版本号</version>
    <packaging>...</packaging>
    
    <!- More Project Information 本项目其他信息 ->
    <name>...</name>
    <description>...</description>
    <url>...</url>
    <inceptionYear>...</inceptionYear>
    <licenses>...</licenses>
    <organization>...</organization>
    <developers>...</developers>
    <contributors>...</contributors>

    <!-- 
        1、依赖管理,主要用于父子项目依赖,通常用于父项目
        2、只声明不进行实际依赖导入,真正导入要由子项目导入,子项目在导入依赖时可不写version,
          子项目自动向上寻找version
     -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>...</groupId>
                <artifactId>...</artifactId>
                <version>...</version>
                <type>...</type>
                <scope>...</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- 本项目依赖工程 -->
        <dependency>
            <groupId></groupId>
            <artifactId></artifactId>
            <version></version>
        </dependency>
        ...
    </dependencies>
    
    <modules>
        <!-- 本项目中其他子模块 -->
        <module>opendaylight/distribution/opendaylight</module>
    </modules>
    <properties>
        <!-- 定义一些常量通常是一些版本号 -->
        <lombok.version>1.18.8</lombok.version>
    </properties>

    <!- Build Settings  项目的编译设置->
    <build>
        <!-- 导出配置文件 -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
    <reporting>...</reporting>

    <!-- Environment Settings -->
    <issueManagement>...</issueManagement>
    <ciManagement>...</ciManagement>
    <mailingLists>...</mailingLists> 
    <scm>...</scm>
    <prerequisites>...</prerequisites>
    <repositories>...</repositories>
    <pluginRepositories>...</pluginRepositories>

    <distributionManagement>
        <!-- 用于发布,通常是nexus服务相关配置 -->
    </distributionManagement>
    <profiles>...</profiles>
</project>

四、分析Opendaylight工程文件

<?xml version="1.0" encoding="UTF-8"?>
<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>

  <!-- 父pom -->
  <parent>
    <groupId>org.opendaylight.controller</groupId>
    <artifactId>commons.parent</artifactId>
    <version>1.0.7-SNAPSHOT</version>
    <relativePath>opendaylight/commons/parent</relativePath>   
    <!-- 父pom所在目录 相对路径 相对于此pom文件 -->
  </parent>


  <artifactId>releasepom</artifactId>
  <version>0.1.7-SNAPSHOT</version>
  <packaging>pom</packaging>
  <prerequisites>
    <maven>3.0</maven>
  </prerequisites>

  <!-- 当前工程下面模块  下面每一个module都对应代码中一个目录 -->
  <modules>
    <module>opendaylight/distribution/opendaylight</module>
    <module>opendaylight/forwarding/staticrouting</module>
    <module>opendaylight/clustering/services</module>
    <module>opendaylight/clustering/services_implementation</module>
    <module>opendaylight/clustering/stub</module>
    <module>opendaylight/clustering/test</module>
    <module>opendaylight/configuration/api</module>
    <module>opendaylight/configuration/implementation</module>
    <module>opendaylight/routing/dijkstra_implementation</module>
    <module>opendaylight/arphandler</module>
    <module>opendaylight/forwardingrulesmanager/api</module>
    <module>opendaylight/distribution/opendaylight-karaf-resources</module>
    <module>features</module>
    <!-- archetypes -->
    <module>opendaylight/archetypes</module>
  </modules>


  <scm>
    <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
    <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
    <tag>HEAD</tag>
    <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
  </scm>

  <profiles>
    <profile>
      <id>integrationtests</id>
      <activation>
        <activeByDefault>false</activeByDefault>
      </activation>
      </activation>
      <modules>
        <module>opendaylight/clustering/integrationtest</module>
        <module>opendaylight/configuration/integrationtest</module>
        <module>opendaylight/forwardingrulesmanager/integrationtest</module>
        <module>opendaylight/hosttracker/integrationtest</module>
        <module>opendaylight/switchmanager/integrationtest</module>
        <module>opendaylight/topologymanager/integrationtest</module>
        <!-- Northbound integration tests -->
        <module>opendaylight/northbound/integrationtest</module>
        <module>opendaylight/statisticsmanager/integrationtest</module>
        <module>opendaylight/commons/integrationtest</module>
        <module>opendaylight/containermanager/it.implementation</module>
        <module>opendaylight/distribution/sanitytest/</module>
      </modules>
    </profile>
    <profile>
      <id>docs</id>
      <activation>
        <activeByDefault>false</activeByDefault>
      </activation>
      <modules>
        <module>opendaylight/northbound/java-client</module>
        <module>opendaylight/northbound/swagger-ui</module>
      </modules>
    </profile>
  </profiles>
</project>

        我对maven的了解也只是皮毛而已,这里只是做一个简单备份与心得。 日后或对maven有更深入的了解,会在修改本博客。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值