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

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

     <plugin>
      <groupid>org.sonatype.tycho</groupid>
      <artifactid>target-platform-configuration</artifactid>
      <version>0.7.0</version>
      <configuration>
        <resolver>p2</resolver>
      </configuration>
    </plugin>
    另外,老牌的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内部的代码 -->
    
                  </
    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
    >
    
                        <!-- 同时传递内置的classpath给外部ant文件 -->
    
                        <
    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。如果要屏蔽该阶段,则用
    <skip>true</skip>
    
    {code:xml}
    <project>
      [...]
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <testFailureIgnore>true</testFailureIgnore>
            </configuration>
          </plugin>
        </plugins>
      </build>
      [...]
    </project>
    {code}
    
    . 问:我如何在maven中加入PMD,CheckStyle,JDepend等检查功能?
    答:加入PMD检查,以下代码如果在
    reporting
    
    节点中加入则在
    mvn site
    
    中执行,如果在
    build
    
    节点中加入,则在build的时候自动运行检查。详细配置参考[pmd插件使用说明|http://maven.apache.org/plugins/maven-pmd-plugin/]
    {code:xml}
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-pmd-plugin</artifactId>
            <version>2.5</version>
          </plugin>
        </plugins>
    {code}
    
    加入 checkstyle 检查,详细配置参考[checkstyle插件使用说明|http://maven.apache.org/plugins/maven- checkstyle-plugin/],同样注意放置在reporting和build节点中的区别(所有报表类插件都要同样注意):
    {code:xml}
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>2.5</version>
          </plugin>
    {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}
          <build>
             <plugins>
                <plugin>
                   <groupId>org.codehaus.mojo</groupId>
                   <artifactId>simian-maven-plugin</artifactId>
                   <version>1.6.1</version>
                </plugin>
             </plugins>
             ...
          </build>
    {code}
    
    加入 jdepend 检查,详细配置参考[jdepend使用说明|http://mojo.codehaus.org/jdepend-maven-plugin/],
    {code:xml}
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jdepend-maven-plugin</artifactId>
            <version>2.0-beta-2</version>
          </plugin>
    {code}
    
    加入 findbugz 检查,详细配置参考[findbugz使用说明|http://mojo.codehaus.org/findbugs-maven-plugin/usage.html],
    {code:xml}
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>2.0.1</version>
          </plugin>
    {code}
    
    加入javadoc生成,详细配置参考[javadoc usage|http://maven.apache.org/plugins/maven-javadoc-plugin/usage.html]
    {code:xml}
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.7</version>
            <configuration>
              ...
            </configuration>
          </plugin>
    {code}
    
    加入 jxr 支持,JXR是一个生成java代码交叉引用和源代码的html格式的工具,详细配置信息参考[jxr usage|http://maven.apache.org/plugins/maven-jxr-plugin/]。注意,jxr没有必要在build阶段运行。
    {code:xml}
      <reporting>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jxr-plugin</artifactId>
            <version>2.1</version>
          </plugin>
        </plugins>
      </reporting>
    {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 }
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
            <version>2.4</version>
            <configuration>
              <check>
                <branchRate>85</branchRate>
                <lineRate>85</lineRate>
                <haltOnFailure>true</haltOnFailure>
                <totalBranchRate>85</totalBranchRate>
                <totalLineRate>85</totalLineRate>
                <packageLineRate>85</packageLineRate>
                <packageBranchRate>85</packageBranchRate>
                <regexes>
                  <regex>
                    <pattern>com.example.reallyimportant.*</pattern>
                    <branchRate>90</branchRate>
                    <lineRate>80</lineRate>
                  </regex>
                  <regex>
                    <pattern>com.example.boringcode.*</pattern>
                    <branchRate>40</branchRate>
                    <lineRate>30</lineRate>
                  </regex>
                </regexes>
              </check>
            </configuration>
            <executions>
              <execution>
                <goals>
                  <goal>clean</goal>
                  <goal>check</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    {code}
    
    {code:xml|title=EMMA}
      <reporting>
        ...
        <plugins>
          ...
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>emma-maven-plugin</artifactId>
            <version>1.0-alpha-3-SNAPSHOT</version>
          </plugin>
          ...
        </plugins>
        ...
      </reporting>
    {code}
    
    添加 javaNCSS 插件,它是一个java代码的度量工具,详细参考在[这里|http://mojo.codehaus.org/javancss-maven-plugin/]。
    {code:xml}
      <reporting>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>javancss-maven-plugin</artifactId>
            <version>2.0-beta-2</version>
          </plugin>
        </plugins>
      </reporting>
    {code}
    
    h4. profile相关
    . 问:profile能够设置为某个变量不存在的条件下激活?
    答:使用!前缀,请看示例:
    {code:xml}
    <activation>
            <property>
              <name>!environment.type</name>
            </property>
          </activation>
    {code}
    
    h4. 部署相关
    . 问:其他部署到服务器的方式和配置怎么配?
    答:本文摘自 [http://blog.csdn.net/zyxnetxz/archive/2009/05/18/4199348.aspx]{panel} *Distribution Management* 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 *# 配置到文件系统
    {code:xml}
    <distributionManagement>
      <repository>
        <id>proficio-repository<id>
        <name>Proficio Repository<name>
        <url>file://${basedir}/target/deploy<url>
      <repository>
    <distributionManagement>
    {code}
    
    *# 使用ssh2配置
    {code:xml}
    <distributionManagement>
      <repository>
        <id>proficio-repository<id>
        <name>Proficio Repository<name>
        <url>scp://sshserver.yourcompany.com/deploy<url>
      <repository>
    <distributionManagement>
    {code}
    
    *# 使用sftp配置
    {code:xml}
    <distributionManagement>
      <repository>
        <id>proficio-repositoryi<d>
        <name>Proficio Repository<name>
        <url>sftp://ftpserver.yourcompany.com/deploy<url>
      <repository>
    <distributionManagement>
    {code}
    
    *# 使用外在的ssh配置编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。
    {code:xml}
    <distributionManagement>
      <repository>
        <id>proficio-repository<id>
        <name>Proficio Repository<name>
        <url>scpexe://sshserver.yourcompany.com/deploy<url>
      <repository>
    <distributionManagement>
    <build>
      <extensions>
        <extension>
          <groupId>org.apache.maven.wagon<groupId>
          <artifactId>wagon-ssh-external<artifactId>
          <version>1.0-alpha-6<version>
        <extension>
      <extensions>
    <build>
    {code}
    
    *# 使用ftp配置
    {code:xml}
    <distributionManagement>
      <repository>
        <id>proficio-repository<id>
        <name>Proficio Repository<name>
        <url>ftp://ftpserver.yourcompany.com/deploy<url>
      <repository>
    <distributionManagement>
    <build>
      <extensions>
        <extension>
          <groupId>org.apache.maven.wagongroupId>
          <artifactId>wagon-ftpartifactId>
          <version>1.0-alpha-6version>
        <extension>
      <extensions>
    <build>
    {code}
    
    {panel} h4. 插件配置
    . 问:我用maven输出site,如何设置输出为utf8编码?
    答: 配置site插件的编码设置
    {code:xml}
    ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>2.0-beta-6</version>
        <configuration>
          <outputEncoding>UTF-8</outputEncoding>
        </configuration>
      </plugin>
      ...
    {code}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值