Maven在工作中几乎是个必备技能,项目团队用这个工具保证整个项目的依赖版本以及更迭,在这里总结一下最常用的技能。
首先,当然是下载安装啦。maven官方的网址是http://maven.apache.org/,这里可以下载到最新以及历史版本的包,linux和windows的src(源码)以及bin(二进制)文件。由于Maven依赖于java,所以首先要安装好jdk,配置好java的环境;之后windows下需要在环境变量中配置maven路径,包括MAVEN_HOME以及Path中的%MAVEN_HOME%\bin;而在linux环境下要在/etc/profile中设置:
M2_HOME=/opt/maven/apache-maven-3.2.1 export M2_HOME PATH=$PATH:$M2_HOME/bin export PATH
并在保存退出后执行命令:source /etc/profile。之后用mvn -v来检验是否安装成功。如果需要在eclipse中很方便地使用maven的相关工具进行测试/打包/发布则需要在eclipse中添加该插件,搞定后比较重要的设置如图,Installations是maven安装的位置,而User Settings中则需要设置maven的settings.xml文件。
安装很简单,网上的教程一抓一把,但是使用之前最好把原理了解清楚。
什么是maven?它的主要功能是什么?--基于java平台的项目构建、依赖管理工具(其实是废话,不懂的还是懵逼)。给几个实际的场景,有好几个项目,需要用到很多很多的jar包,能不能用一个仓库来搞定呢?项目代码中测试方法能不能一次运行?怎样把一个模块的功能放到一个仓库里,尤其是公共的服务?...
maven可以在本机建立一个jar包的仓库,存储着本机maven历史使用过的jar包,工程中的配置文件pom.xml中的<dependency/>就指向了这些jar包,可以做到jar包的重用,该标签的版本就能够准确地定义该jar包的版本,方便团队协调管理。如果本机的仓库没有这个jar包,那么它会自动地根据安装maven时自动创建的.m2文件中的settings.xml文件在私服(也是方便团队管理依赖)或者中央库中找到这个jar包。它们的关系如图:
在.m2中的settings.xml可以控制maven一旦在本机找不到jar包后是到私服去找还是到互联网中寻找该jar包,顺便一提,互联网中的<dependency/>可以在http://mvnrepository.com/中搜索,非常方便。默认的settings.xml文件会直接到互联网中央库中寻找需要的jar包,而私服需要自行配制,<profile/>中配置id以及地址等,并用<activeProfiles/>激活,如果配置镜像<mirrors/>可以保证maven只在私服中寻找本地缺失的依赖,找不到即寻找失败,不会到网络中寻找,这也是推荐的做法。
前文提到的场景,jar包的管理只是其一,后面的可否测试则涉及到了maven的生命周期。如图:
clean compile test report install deploy ========================================》
Maven的生命周期
用maven命令构建项目时,它的默认顺序就是依次执行周期中的每一环。关于这一点,比较常见的是在开发初期,常常会跳过测试进行编译打包,命令如下:
mvn install -Dmaven.test.skip=true
所以自动构建中,整个项目是会从target中清除之前的结果,编译,测试,报告,打包甚至到发布(需要配置)一次跑通,当然你可以只跑其中一部分。在eclipse安装插件后,可以在工程中run as中看到这些选项,或者在maven build...选项的Goals中添加构建目标。
再看第三个问题,将公共的服务发布到私服中,共享给团队的其它成员。这就是如何将项目打包,而后发布到私服中。涉及到几个问题,一个是maven项目的约定,即项目结构;二是打包,以及发布的配置;第三就是maven对于jar包的定位标签。一个一个来看,maven的项目结构如图,pom是配置文件,target中存放打包之后产生的文件:
要注意的是,原生的maven工程并不能够直接导入eclipse中,需要用命令mvn eclipse:eclipse做个转换。
打包,需要选择最终打包的形态为jar、war或者pom,以jar为例,需要现在settings.xml中配置好<server/>以及<mirrors/><profile/>,并在<pom/>中配置好<distributionManagement/>。
<server/>中可以根据pom中的版本号(是否为snapshot)而将jar包发布到不同的库中。
<servers> <server> <id>rcsRelases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>rcsSnapshots</id> <username>admin</username> <password>admin123</password> </server> </servers>
<mirrors/>
<mirrors> <mirror> <id>central</id> <mirrorOf>*</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://10.3.30.41:8089/nexus/content/groups/public/</url> </mirror> </mirrors>
<profile/>与<activeProfiles/>
<profiles> <profile> <id>jdk17</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.7</jdk> </activation> <properties> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion> </properties> </profile> <profile> <id>central-repos</id> <repositories> <repository> <id>central</id> <name>Central</name> <url>http://central</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles> <activeProfiles> <activeProfile>central-repos</activeProfile> </activeProfiles>
其中设置了所有maven项目默认使用jdk1.7作为开发环境。
而在pom中,需要指定:
<distributionManagement> <repository> <id>rcsSnapshots</id> <name>rcsSnapshots</name> <url>http://10.3.30.41:8089/nexus/content/repositories/rcsSnapshots</url> </repository> </distributionManagement>
要注意的是,该标签中的id要和server中的id一致,并且需要相关权限,才能发布到nexus中。
maven如何定位jar包呢?很简单,通过标签所约定的坐标:groupId约定包,artifact约定依赖的名称,version约定依赖的版本,通过这三个坐标就能找到该jar包在本地仓库的位置。
最后,maven可以将一个工程核心代码打包和该项目依赖分离开来,通过在pom中设置,可以达到效果,这样就可以在本地上传代码时,只传一次依赖(通常很多很大)而多次修改核心代码jar包(通常很小)而节省上传到服务器上的时间:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.changjiang.data.service.center.sync.module.consumer.Main</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.2</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> </plugins> </build>
本篇介绍到这里,基本的概念原理和命令都概括到了,如果以后遇到其它问题,可以在随记2中进行积累。