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中进行积累。

posted on 2016-08-18 15:54  长江同学  阅读(271)  评论(0编辑  收藏  举报