Maven 简单介绍
2015-10-24 16:06
387 查看
在java世界中,工程管理是靠maven(在c/c++中是make),在研究任何一款开源软件,尤其像opendaylight这种大型开源软件,如果能够梳理清楚各个工程依赖,对于我们学习与研发会起到事半功倍的效果。由于接触maven时间不是很长,这里如果有什么不对,请各位批评指出。
maven的目录结构还是非常清楚与简单的。 虽然有四个目录,但是我们经常用的只有两个,那就是bin、conf目录。通过目录名字大家应该就能猜到他们作用。bin目录是存放可执行程序,也就是mvn命令行所在目录。 conf存在maven相关的配置,如本地仓库、远程仓库、代理等。boot 和 lib 分别是maven它自己所用到的库或者插件 等。
<localRepository>绝对路径</localRepository> //本地仓库存储路径,默认为${user.home}/.m2/repository 例如:登录linux当前用户为tmp,则默认本地仓库为/home/tmp/.m2/repository
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
</pluginGroups> 项目所有者。 一般以公司域名逆序加项目名称。 例如opendaylight项目中的controller是这样的:org.opendaylight.controller
<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> 为了节省流量和方便开发,很多个公司都会创建自己的私服。此处的镜像就是为了创建私服。
<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> 链接私服的代理。
1) 其中带有.cmd是window下面的,不带.cmd则是linux下面的。
2) 带有debug字样的文件是支持,maven自身调试用的。我们一般用不到。 mvnyjp不清楚是什么作用,基本上不用。
3) m2.conf 环境变量配置,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
<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有更深入的了解,会在修改笨博客。
一、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文件内容。<localRepository>绝对路径</localRepository> //本地仓库存储路径,默认为${user.home}/.m2/repository 例如:登录linux当前用户为tmp,则默认本地仓库为/home/tmp/.m2/repository
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
</pluginGroups> 项目所有者。 一般以公司域名逆序加项目名称。 例如opendaylight项目中的controller是这样的:org.opendaylight.controller
<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> 为了节省流量和方便开发,很多个公司都会创建自己的私服。此处的镜像就是为了创建私服。
<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是项目对象模型)。我们接下来会介绍一些常用属性。<span style="font-size:14px;"><project> <span style="color:#FF0000;"> <modelVersion>4.0.0</modelVersion> 描述这个POM文件是遵从哪个版本的项目描述符。 默认是4.0.0 <!- The Basics 项目的基本信息-> <groupId>经常是公司域名逆序形式</groupId> <artifactId>项目名称</artifactId> <version>项目版本号</version> //红色部分是必须包含的配置项</span> <packaging>...</packaging> <dependencies>本项目依赖工程</dependencies> <parent>本项目的pom文件所继承父pom文件</parent> <dependencyManagement>...</dependencyManagement> <modules>本项目中其他的模块</modules> <properties>...</properties> <!- Build Settings 项目的编译设置-> <build>...</build> <reporting>...</reporting> <!- More Project Information 其它项目信息 -> <name>...</name> <description>...</description> <url>...</url> <inceptionYear>...</inceptionYear> <licenses>...</licenses> <organization>...</organization> <developers>...</developers> <contributors>...</contributors> <!-- Environment Settings -> <issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists> <scm>...</scm> <prerequisites>...</prerequisites> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <distributionManagement>...</distributionManagement> <profiles>...</profiles> </project></span>
四、分析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有更深入的了解,会在修改笨博客。
相关文章推荐
- 面向接口编程的好处
- 动画--过渡属性 transition-property
- mysql表and字段注释添加
- linux命令---top命令
- TCP协议中的三次握手和四次挥手(图解)
- Android面试题及答案1
- 多米诺DP(双向背包)算法总结
- GUID(转载)
- 三、jQuery--jQuery基础--jQuery基础课程--第1章 初识jQuery
- 第八周项目4字符串加密
- 第8周 项目 3 - 顺序串算法
- 如何创建数据库表之间的关联关系
- CentOS7伪分布式下 hive安装过程中遇到的问题及解决办法
- POJ 2004 Hire and Fire(树+好题)
- 各版本Linux下安装实验ORACLE+10gR2+ASM+升级到10.2.0.5+单实例
- 可变参数列表实现任意个数求平均值和简单的输出功能
- Java 的 ArrayList 的底层数据结构
- POJ 1860 Currency Exchange(Bellman-Ford)
- Cocoa Touch的类名为什么是以两个大写字母开头的?
- cdev_add alloc_chrdev_region 系列函数