maven常见问题问答

阅读更多

1.前言

Maven,发音是[`meivin],"专家"的意思。它是一个很好的项目管理工具,很早就进入了我的必备工具行列,但是这次为了把project1项 目完全迁移并应用maven,所以对maven进行了一些深入的学习。写这个学习笔记的目的,一个是为了自己备忘,二则希望能够为其他人学习使用 maven 缩短一些时间。

2. maven概要

首先我把maven的概念快速的梳理一下,让我们快速地建立起一个比较精确的maven应用场景。

2.1 maven不是什么

读书时候要先限定范围,避免一些有害的遐想。要说maven不是什么,我们可以从如下几个要点来展开

  1. maven不是ant,也不是make。
    我们以前接触的构建工具,需要写一些详细的步骤,比如: compile project1/src } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
    4) 如果只想运行单个测试用例,能否实现?

    可以,运行时候增加命令行参数 -Dtest=MyTest 即可,其中MyTest是所需要运行的单元测试用例名称,但是不需要包含package部分。

    4.3 编译

    1) 问:如何给插件指派参数?比如我要设置一些编译参数

    答:以下内容设定编译器编译java1.5的代码

    < project >
        ...
       
    < build >
            ...
           
    < plugins >
               
    < plugin >
                   
    < artifactId > maven-compiler-plugin artifactId >
                   
    < configuration >
                       
    < source > 1.5 source >
                       
    < target > 1.5 target >
                   
    configuration >
               
    plugin >
           
    plugins >
            ...
       
    build >
        ...
    project >
    要设置其他插件的参数也可以,请参考对应插件的帮助信息
    2) 问:我的目录是非标准的目录结构,如何设置让maven支持?

    答:指定source目录和test-source目录即可。

    < build >
       
    < directory > target directory >
       
    < sourceDirectory > src sourceDirectory >
       
    < scriptSourceDirectory > js/scripts scriptSourceDirectory >
       
    < testSourceDirectory > test testSourceDirectory >
       
    < outputDirectory > bin outputDirectory >
       
    < testOutputDirectory > bin testOutputDirectory >
    build >
    这个例子把源代码设置成了src目录,测试代码在test目录,所以输出到bin目录。这里要注意,directory如果也设置成bin目录的 话,maven打包的时候会引起死循环,因为directory是所有工作存放的地方,默认包含outputDirectory定义的目录在内。
    3) 我源代码是UTF8格式的,我如何在maven中指定?

    设置一个变量即可

    < project >
        ...
       
    < properties >
           
    < project.build.sourceEncoding > UTF-8 project.build.sourceEncoding >
       
    properties >
        ...
    project >
    {color:blue}以上是官方给出的解决方案,但是经过尝试这样只能影响到resource处理时候的编码{color},真正有用的是如下配置:
    {code:xml}
    
      ...
        
          maven-compiler-plugin
          
            UTF-8
          
        
      ...
    
    {code}
    
    . 问:我的项目除了main/java目录之外,还加了其他的c++目录,想要一并编译,如何做?
    答:使用native插件,具体配置方法参考[http://mojo.codehaus.org/maven-native/native-maven-plugin/]
    {code:xml}
    
        org.codehaus.mojo
        native-maven-plugin
        true
        
        
    {code}
    
    . 问:我想要把工程的所有依赖的jar都一起打包,怎么办?
    答:首先修改maven的配置文件,给maven-assembly-plugin增加一个jar-with-dependencies的描述。
    {code:xml}
    
      [...]
      
        
          
            maven-assembly-plugin
            
              
                jar-with-dependencies
              
            
          
        
      
      [...]
    
    {code}
    
    然后使用命令打包即可:
    mvn assembly:assembly
    
    . 问:我想把main/scripts中的内容一起打包发布,如何做?
    答:在pom中配置额外的资源目录。如果需要的话,还可以指定资源目录的输出位置
    {code:xml}
    
      ...
      
        
          true
          src/main/command
          
            run.bat
            run.sh
          
          /abc
        
        
          src/main/scripts
        
      
      ...
    
    {code}
    
    . 问:我有多个源代码目录,但是maven只支持一个main src和一个test src,怎么办?
    答:使用另外一个插件,并仿照如下配置pom
    {code:xml}
    
            org.codehaus.mojo
            build-helper-maven-plugin
            1.1
            
              
                add-source
                generate-sources
                
                  add-source
                
                
                  
                    src/config/java
                    src/main/java
                    src/member/java
                  
                
              
            
          
    {code}
    
    . 问:我的源代码目录中有一部分文件我不想让maven编译,怎么做?
    答:使用一个maven插件,然后使用includes和excludes。同理,也可以处理资源的过滤。
    {code:xml}
    
      http://www.cnblogs.com/src/java
      
        
          com.sun.enterprise
          hk2-maven-plugin
          
            
              com/sun/logging/LogDomains.*
              com/sun/enterprise/util/OS.java
              com/sun/enterprise/util/io/FileUtils.java
              com/sun/enterprise/util/zip*.properties
          
        
      
    
    {code}
    
    . 问:我的项目是一个纯的html组成的项目,没有任何的java代码,怎么跳过编译过程?
    答:配置如下
    {code:xml}
    
      src/java
      
        
        com.sun.enterprise
        hk2-maven-plugin
        
      
    
    {code}
    
    . 问:我的工程里用hibernate,想在编译时候自动生成ddl,如何做?
    答:添加插件
    hibernate3-maven-plugin
    
    ,按照如下配置:
    {code:xml}
            
              org.codehaus.mojo
              hibernate3-maven-plugin
              2.1
              
                
                  
                    hbm2ddl
                    annotationconfiguration
                  
                
              
              
                
                  hsqldb
                  hsqldb
                  ${hsqldb.version}
                
              
            
    {code}
    
    . 问:我能用maven支持eclipse RCP项目吗?

    答:当然可以,你可以使用插件 Tycho,详细内容可以参考这里[http://mattiasholmqvist.se/2010/02/building-with-tycho-part-1-osgi-bundles/ ].

     
      org.sonatype.tycho
      target-platform-configuration
      0.7.0
      
        p2
      
    
    另外,老牌的pde-maven-plugin就不要用了,已经好几年没见更新了。
    

    4.4 ant互动

    1) 如何在maven编译时候运行ant脚本?

    使用专门的antrun插件,并且在target标签内部加入ant的代码

          <
    plugin
    >
    
            <
    artifactId
    >
    maven-antrun-plugin
    artifactId
    >
    
            <
    version
    >
    1.6
    version
    >
    
            <
    executions
    >
    
              <
    execution
    >
    
                <
    phase
    >
     
     
    phase
    >
    
                <
    configuration
    >
    
                  <
    target
    >
    
                    
    
                  
    target
    >
    
                
    configuration
    >
    
                <
    goals
    >
    
                  <
    goal
    >
    run
    goal
    >
    
                
    goals
    >
    
              
    execution
    >
    
            
    executions
    >
    
          
    plugin
    >
    
    

    2)如何在ant脚本中引用maven的classpath?

    maven给每一个依赖都生成了一个属性,格式为"groupId:artifactId[:classifier]:type",比如,如果一下例子就显示依赖的org.apache.common-util的jar文件路径

    <
    echo
     message
    ="Dependency JAR Path: ${org.apache:common-util:jar}"
    />
     
    

    另外,maven还预定义了四个classpath的引用,他们是

    • maven.compile.classpath
    • maven.runtime.classpath
    • maven.test.classpath
    • maven.plugin.classpath

    3)如何使用antrun插件运行外部的build文件?

    很简单,直接在antrun里边使用ant指令即可,如下:

    <
    plugin
    >
    
        <
    groupId
    >
    org.apache.maven.plugins
    groupId
    >
    
        <
    artifactId
    >
    maven-antrun-plugin
    artifactId
    >
    
        <
    version
    >
    1.6
    version
    >
    
        <
    executions
    >
    
            <
    execution
    >
    
                <
    id
    >
    compile
    id
    >
    
                <
    phase
    >
    compile
    phase
    >
    
                <
    configuration
    >
    
                    <
    target
    >
    
                        
    
                        <
    property
     name
    ="compile_classpath"
     refid
    ="maven.compile.classpath"
    />
    
                        <
    property
     name
    ="runtime_classpath"
     refid
    ="maven.runtime.classpath"
    />
    
                        <
    property
     name
    ="test_classpath"
     refid
    ="maven.test.classpath"
    />
    
                        <
    property
     name
    ="plugin_classpath"
     refid
    ="maven.plugin.classpath"
    />
    
        
                        <
    ant
     antfile
    ="${basedir}/build.xml"
    >
    
                            <
    target
     name
    ="test"
    />
    
                        
    ant
    >
    
                    
    target
    >
    
                
    configuration
    >
    
                <
    goals
    >
    
                    <
    goal
    >
    run
    goal
    >
    
                
    goals
    >
    
            
    execution
    >
    
        
    executions
    >
    
    
    plugin
    >
    
    
    . 问:如何在ant中使用maven的功能?
    答:使用ant的[maven task|http://maven.apache.org/ant-tasks/index.html],不过只有ant 1.6以上和jdk 1.5环境才支持。

    h4. 测试相关

    . 问:如何忽略某个阶段的结果?比如单元测试不一定要全正确
    答:给插件增加testFailureIgnore参数,并设置为false。如果要屏蔽该阶段,则用
    true
    
    {code:xml}
    
      [...]
      
        
          
            org.apache.maven.plugins
            maven-surefire-plugin
            
              true
            
          
        
      
      [...]
    
    {code}
    
    . 问:我如何在maven中加入PMD,CheckStyle,JDepend等检查功能?
    答:加入PMD检查,以下代码如果在
    reporting
    
    节点中加入则在
    mvn site
    
    中执行,如果在
    build
    
    节点中加入,则在build的时候自动运行检查。详细配置参考[pmd插件使用说明|http://maven.apache.org/plugins/maven-pmd-plugin/]
    {code:xml}
        
          
            org.apache.maven.plugins
            maven-pmd-plugin
            2.5
          
        
    {code}
    
    加入 checkstyle 检查,详细配置参考[checkstyle插件使用说明|http://maven.apache.org/plugins/maven- checkstyle-plugin/],同样注意放置在reporting和build节点中的区别(所有报表类插件都要同样注意):
    {code:xml}
          
            org.apache.maven.plugins
            maven-checkstyle-plugin
            2.5
          
    {code}
    
    加入 simian 的支持,simian是一个支持代码相似度检查的工具,目前有maven插件,也有checkstyle的插件。它不仅可以检查java,甚至可以支持文 本文件的检查。详细帮助信息参考[这里|http://www.redhillconsulting.com.au/products/simian /]。simian 的 maven插件在[这里|http://mojo.codehaus.org/simian-report-maven-plugin /introduction.html]
    {code:xml}
          
             
                
                   org.codehaus.mojo
                   simian-maven-plugin
                   1.6.1
                
             
             ...
          
    {code}
    
    加入 jdepend 检查,详细配置参考[jdepend使用说明|http://mojo.codehaus.org/jdepend-maven-plugin/],
    {code:xml}
          
            org.codehaus.mojo
            jdepend-maven-plugin
            2.0-beta-2
          
    {code}
    
    加入 findbugz 检查,详细配置参考[findbugz使用说明|http://mojo.codehaus.org/findbugs-maven-plugin/usage.html],
    {code:xml}
          
            org.codehaus.mojo
            findbugs-maven-plugin
            2.0.1
          
    {code}
    
    加入javadoc生成,详细配置参考[javadoc usage|http://maven.apache.org/plugins/maven-javadoc-plugin/usage.html]
    {code:xml}
          
            org.apache.maven.plugins
            maven-javadoc-plugin
            2.7
            
              ...
            
          
    {code}
    
    加入 jxr 支持,JXR是一个生成java代码交叉引用和源代码的html格式的工具,详细配置信息参考[jxr usage|http://maven.apache.org/plugins/maven-jxr-plugin/]。注意,jxr没有必要在build阶段运行。
    {code:xml}
      
        
          
            org.apache.maven.plugins
            maven-jxr-plugin
            2.1
          
        
      
    {code}
    
    加入 Cobertura 支持,它是一个代码覆盖率工具,可以用来评估具有相应测试的源代码的比率。详细帮助在[这里|http://mojo.codehaus.org /cobertura-maven-plugin/index.html]。另外一个功能相似的软件是[EMMA|http: //emma.sourceforge.net/samples.html],详细的帮助在[这里|http://mojo.codehaus.org /emma-maven-plugin/usage.html]。两个产品的比较文章在[这里|http://www.topcoder.com /tc?module=Static&d1=features&d2=030107],个人倾向于都要用,因为给出的指标不一样,都有参 考作用。
    {code:xml|title=Cobertura }
          
            org.codehaus.mojo
            cobertura-maven-plugin
            2.4
            
              
                85
                85
                true
                85
                85
                85
                85
                
                  
                    com.example.reallyimportant.*
                    90
                    80
                  
                  
                    com.example.boringcode.*
                    40
                    30
                  
                
              
            
            
              
                
                  clean
                  check
                
              
            
          
    {code}
    
    {code:xml|title=EMMA}
      
        ...
        
          ...
          
            org.codehaus.mojo
            emma-maven-plugin
            1.0-alpha-3-SNAPSHOT
          
          ...
        
        ...
      
    {code}
    
    添加 javaNCSS 插件,它是一个java代码的度量工具,详细参考在[这里|http://mojo.codehaus.org/javancss-maven-plugin/]。
    {code:xml}
      
        
          
            org.codehaus.mojo
            javancss-maven-plugin
            2.0-beta-2
          
        
      
    {code}
    
    h4. profile相关
    . 问:profile能够设置为某个变量不存在的条件下激活?
    答:使用!前缀,请看示例:
    {code:xml}
    
            
              !environment.type
            
          
    {code}
    
    h4. 部署相关
    . 问:其他部署到服务器的方式和配置怎么配?
    答:本文摘自 [http://blog.csdn.net/zyxnetxz/archive/2009/05/18/4199348.aspx]{panel} *Distribution Management* 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 *# 配置到文件系统
    {code:xml}
    
      
        proficio-repository
        Proficio Repository
        file://${basedir}/target/deploy
      
    
    {code}
    
    *# 使用ssh2配置
    {code:xml}
    
      
        proficio-repository
        Proficio Repository
        scp://sshserver.yourcompany.com/deploy
      
    
    {code}
    
    *# 使用sftp配置
    {code:xml}
    
      
        proficio-repositoryi
        Proficio Repository
        sftp://ftpserver.yourcompany.com/deploy
      
    
    {code}
    
    *# 使用外在的ssh配置编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。
    {code:xml}
    
      
        proficio-repository
        Proficio Repository
        scpexe://sshserver.yourcompany.com/deploy
      
    
    
      
        
          org.apache.maven.wagon
          wagon-ssh-external
          1.0-alpha-6
        
      
    
    {code}
    
    *# 使用ftp配置
    {code:xml}
    
      
        proficio-repository
        Proficio Repository
        ftp://ftpserver.yourcompany.com/deploy
      
    
    
      
        
          org.apache.maven.wagongroupId>
          wagon-ftpartifactId>
          1.0-alpha-6version>
        
      
    
    {code}
    
    {panel} h4. 插件配置
    . 问:我用maven输出site,如何设置输出为utf8编码?
    答: 配置site插件的编码设置
    {code:xml}
    ...
      
        org.apache.maven.plugins
        maven-site-plugin
        2.0-beta-6
        
          UTF-8
        
      
      ...
    {code}
    

你可能感兴趣的:(maven)