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中进行积累。
浙公网安备 33010602011771号