Apache Maven,是一个软件(特别是java软件)项目及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、测试报告和文档等。

     maven有规定好的目录结构,项目必须严格遵从。一个 maven 项目在默认情况下会产生 JAR 文件,另外 ,编译后 的 classes 会放在 ${basedir}/target/classes 下面, JAR 文件会放在${basedir}/target 下面

    

目录 作用
${basedir} 存放 pom.xml和所有的子目录
${basedir}/src/main/java 项目的 java源代码
${basedir}/src/main/resources 项目的资源,比如说 property文件
${basedir}/src/test/java

项目的测试类,比如说 JUnit代码

${basedir}/src/test/resources 测试使用的资源


        一,maven配置文件

        全局配置文件:{installed_dir}/conf/settings.xml

        优先级更高的配置文件:${user.home}/.m2/settings.xml

        二,maven本地和远程仓库

        本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错,这种情况可能发生在有些jar包的新版本没有在Maven仓库中及时更新。

        1,自定义的本地仓库路径     

如下配置,在setting.xml文件中,本地仓库有默认配置,在${user.home}/.m2/repository目录中。

 

当然,我们可以在settings.xml中自定义本地仓库,加入以下字段即可:

/opt/java/repo


也可以通过命令行的模式指定本地仓库:(不推荐这么做)

# mvn clean install -Dmaven.repo.local=/home/juven/myrepo/


        2,自定义远程仓库

     默认远程仓库配置:

    在apache-maven-3.0.4/lib/maven-model-builder-3.0.4.jar文件中org/apache/maven/model/pom-4.0.0.xml文件中定义了中央仓库:

   

      central

      Central Repository

      http://repo.maven.apache.org/maven2

      default

     

        false

     

   

 


 

   

      central

      Central Repository

      http://repo.maven.apache.org/maven2

      default

     

        false

     

     

        never

     

   

 


   setting.xml配置文件中定义远程仓库,优先级高,配置如下:

   pom.xml的作用范围限于一个项目, 但一个公司/组织通常不只开发一个项目,那么为了避免重复配置,那么我们可以把一些公共配置放在${MAVEN_HOME}/conf/setting.xml(或${user.home}/.m2/setting.xml中。下面是在setting.xml中配置一个远程仓库的例子.

 
 
   
     
   

     
     myProfiel  
     
   
 
 
 
 
 
   
   myProfiel  
 
 
 

     这里通过元素来激活这个profile,这样我们就可以全局的使用这个配置,不再需要为每个POM做重复的配置了(也可以针对特定的条件激活,比如某些profile只有在使用JDK 1.4时才生效)。

     在实际的操作过程中,setting.xml配置的远程仓库,可以是通过nexus建立的公司自己的仓库。


    pom.xml文件定义远程仓库,优先级最高,配置如下:

   

       

            Nexus

            Nexus Public Repository

            http://maven.test.sohu.com/nexus/content/groups/public

       

       

            nexus-snapshots

            Nexus Snapshot Repository

            http://maven.test.sohu.com/nexus/content/repositories/snapshots

           

                true

           

       

   

在pom中允许配置多个repository和 plugin repository,其中true

告诉Maven可以从这个仓库下载snapshots版本的构件。而如果有false这样的配置,则告诉Maven不要从这个仓库下载snapshot版本的构件。

Maven在使用第三方构件和插件时是分开来配置的,所以如果我们也希望插件的下载也通过我们自己的仓库来下载,那么我们就需要配置pluginRepository.至于,这是配置Maven从什么地方下载插件构件,Maven的所有行为都是通过插件来完成的。 的配置与类似。


    三,maven发布jar包到nexus服务器

    1),在pom.xml文件中可以定义如下代码:

   
       
            nexus-releases
            Nexus Release Repository
            http://maven.test.sohu.com/nexus/content/repositories/releases
       


       
            nexus-snapshots
            Nexus Snapshot Repository
            http://maven.t.sohu.com/nexus/content/repositories/snapshots
            false
       

   

    2)确保Nexus服务器的Releases仓库属性正确。

         进入Nexus控制台,用admin登录。点开“Views/Repositories”选“Repositories”,在Repositories列表中选择Releases,点configuration,Deployment Policy默认为“Disable Redeploy”,点击修改为“Allow Redeploy”并保存。

      3)修改用户目录下的settings.xml文件。

         settings.xml文件路径为${user.home}/.m2或%{m2_home}/conf/。Windows7系统目录为C:/Users/用户名/.m2。

         找到,然后修改信息如下:
 
    
       releases
       deployment
       deployment
    

 

注意:server的id必须和第1)点中的repository的id一致。用户名最好用deployment。

      4)重新设定用户deployment的密码。

         进入Nexus控制台,点开Security选Users,在用户列表中右键点击deployment用户,选Set Password重新设定deployment的密码为“deployment”,当然也可设置为其他,只要与第3)点server配置一致即可。

      5)在工程主目录下(POM文件所在目录)运行“mvn deploy:deploy”即能实现版本的构建和发布。


    四,maven使用assembly实现自定义打包

pom.xml中设置如下:


        
            
                maven-assembly-plugin
                
                    
                    false
                    
                        src/main/assemble/package.xml
                    

                

                
                    
                        make-assembly
                        package
                        
                            single
                        

                    

                

            

        

    

  其中maven-assembly-plugin的maven-assembly-plugin是这个插件的标准命名,在maven2.0.*中带的默认版本是

    appendAssemblyId属性控制是否在生成的打包文件的文件名中包含assembly id。

    descriptor属性指定maven-assembly-plugin的配置文件,当然我设置的是src/main/assemble/package.xml.容许使用多个,功能强大当然用法也复杂,对于简单情况一个足矣。

    execution的设置是为了将maven-assembly-plugin继承到标准的maven打包过程中,这样在运行命令mvn package时就会执行maven-assembly-plugin的操作,从而实现我们需要的自定义打包,这样就不用再去执行mvn assembly:assembly指令了。


    五,maven的常用命令和参数、

1,常用参数

mvn -e 显示详细错误
mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖)
mvn -o 运行offline模式,不联网更新依赖
mvn -N 仅在当前项目模块执行命令,关闭reactor
mvn -pl module_name在指定模块上执行命令
mvn -ff 在递归执行命令过程中,一旦发生错误就直接退出

mvn -Dxxx=yyy指定java全局属性

    mvn -Dwtpversion=2.0 指定maven版本
    mvn -Dmaven.test.skip=true 如果命令包含了test phase,则忽略单元测试
    mvn -DuserProp=filePath 指定用户自定义配置文件位置
    mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse项目文件,尝试从仓库下载源代码,并且生成的项目包含模块版本(注意如果使用公用POM,上述的开关缺省已打开)


mvn -Pxxx引用profile xxx。profile的定义在pom.xml文件中,一般id为test或者product,一个是测试环境的配置,一个是线上环境的配置。配置如下:

       

            test

           

                test

           

       

       

            product

           

                product

           

           

                true

           

       

   


2,常用命令

mvn compile     编译生成class文件

mvn test        运行程序中的单元测试

mvn clean       移除所有上一次构建生成的文件(例如test和target目录)

mvn package     打包编译后的代码,在target目录下生成package文件,默认会生成jar文件,如果有自定义打包策略,可以生成zip等类型文件。需要的依赖文件,会先从本地仓库找(linux默认为~/.m2/repository/),没有的话,再从远处仓库download

mvn install      在本地Repository中安装jar,方便本地其它项目使用。默认是安装打好的包到server的本地mvn仓库中,linux默认为~/.m2/repository/


常用的打包命令:

# mvn -U -Dmaven.test.skip=true -P test -f pom.xml clean package install