在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有更深入的了解,会在修改本博客。