首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

(转)maven常见有关问题问答

2012-09-25 
(转)maven常见问题问答http://www.iteye.com/topic/973166前言Maven,发音是[`meivin],专家的意思。它是一

(转)maven常见问题问答

http://www.iteye.com/topic/973166

前言

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

maven概要

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

maven不是什么

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

  1. maven不是ant,也不是make。
    我们以前接触的构建工具,需要写一些详细的步骤,比如:Xml代码
    1. <modules>??
    2. ????<module>simple-weather</module>??
    3. ????<module>simple-webapp</module>??
    4. </modules>??
    ?

    其次在每个子项目中加入

    Xml代码
    1. <project>??
    2. ??<description>This?is?a?project?requiring?JDBC</description>??
    3. ??...??
    4. ??<dependencies>??
    5. ????...??
    6. ???<dependency>??
    7. ??????<groupId>org.sonatype.mavenbook</groupId>??
    8. ??????<artifactId>persistence-deps</artifactId>??
    9. ??????<version>1.0</version>??
    10. ??????<type>pom</type>??
    11. ????</dependency>??
    12. ??</dependencies>??
    13. </project>??
    ?
    属性

    用户可以在maven中定义一些属性,然后在其他地方用${xxx}进行引用。比如:

    Xml代码
    1. <project>??
    2. ????<modelVersion>4.0.0</modelVersion>??
    3. ????...??
    4. ????<properties>??
    5. ????????<var1>value1</var1>??
    6. ????</properties>??
    7. </project>??
    ?

    ?

    maven提供了三个隐式的变量,用来访问系统环境变量、POM信息和maven的settings:

    • env
      暴露操作系统的环境变量,比如env.PATH
    • project
      暴露POM中的内容,用点号(.)的路径来引用POM元素的值,比如${project.artifactId}。另外,java的系统属性比如user.dir等,也暴露在这里。
    • settings
      暴露maven的settings的信息,也可以用点号(.)来引用。maven把系统配置文件存放在maven的安装目录中,把用户相关的配置文件存放 在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。
      maven的profile

      profile是maven的一个重要特性,它可以让maven能够自动适应外部的环境变化,比如同一个项目,在linux下编译linux的版 本,在win下编译win的版本等。一个项目可以设置多个profile,也可以在同一时间设置多个profile被激活(active)的。自动激活的 profile的条件可以是各种各样的设定条件,组合放置在activation节点中,也可以通过命令行直接指定。profile包含的其他配置内容可 以覆盖掉pom定义的相应值。如果认为profile设置比较复杂,可以将所有的profiles内容移动到专门的maven-archetype-j2ee-simpleorg.apache.maven.archetypes??A simple J2EE Java applicationmaven-archetype-marmalade-mojoorg.apache.maven.archetypes??A Maven plugin development project using marmalademaven-archetype-pluginorg.apache.maven.archetypes??A Maven Java plugin development projectmaven-archetype-portletorg.apache.maven.archetypes??A simple portlet applicationmaven-archetype-profilesorg.apache.maven.archetypes???maven-archetype-quickstartorg.apache.maven.archetypes???maven-archetype-simpleorg.apache.maven.archetypes???maven-archetype-site-simpleorg.apache.maven.archetypes??A simple site generation projectmaven-archetype-siteorg.apache.maven.archetypes??A more complex site projectmaven-archetype-webapporg.apache.maven.archetypes??A simple Java web applicationmaven-archetype-harnet.sf.maven-har0.9?Hibernate Archivemaven-archetype-sarnet.sf.maven-sar0.9?JBoss Service Archive

      大家可以参考更详细的Xml代码

      1. <modules>??
      2. ????<module>ABCCommon</module>??
      3. ????<module>ABCCore</module>??
      4. ????<module>ABCTools</module>??
      5. </modules>??
      ?

      ?

      要记住的是,这里的module是目录名,不是子工程的artifactId。子工程如下设置:

      Xml代码
      1. <parent>??
      2. ????<groupId>com.abc.product1</groupId>??
      3. ????<artifactId>abc-product1</artifactId>??
      4. ????<version>1.0.0-SNAPSHOT</version>??
      5. ??</parent>??
      6. ??<artifactId>abc-my-module2</artifactId>??
      7. ??<packaging>jar</packaging>??
      ?

      ?

      这样两者就相互关联起来了,继承关系就设定完毕,所有父工程的配置内容都会自动在子工程中生效,除非子工程有相同的配置覆盖。如果你不喜欢层层递进的目录结构来实现继承,也可以在parent中加入Xml代码

      1. <dependency>??
      2. ??????<groupId>org.sonatype.mavenbook</groupId>??
      3. ??????<artifactId>persistence-deps</artifactId>??
      4. ??????<version>1.0</version>??
      5. ??????<type>pom</type>??
      6. ????</dependency>??
      ?

      ?

      但是无论是父项目还是引用项目,这些工程都必须用Xml代码

      1. <dependency>??
      2. ????????<groupId>org.springframework</groupId>??
      3. ????????<artifactId>spring</artifactId>??
      4. </dependency>??
      ?

      ?

      这种方法可以避免版本号满天飞的情况。

      安装库文件到maven库中

      在maven中一般都会用到安装库文件的功能,一则是我们常用的hibernate要使用jmx库,但是因为sun的license限制,所以无法将其直接包含在repository中。所以我们使用mvn命令把jar安装到我们本地的repository中

      Xml代码
      1. <distributionManagement>??
      2. ????<repository>??
      3. ??????<id>mycompany-repository</id>??
      4. ??????<name>MyCompany?Repository</name>??
      5. ??????<url>scp://repository.mycompany.com/repository/maven2</url>??
      6. ????</repository>??
      7. ??</distributionManagement>??
      ?

      ?

      这里使用的scp方式提交库文件,还有其他方式可以使用,请参考faq部分。然后记得在你的settings.xml中加入这一内容

      Xml代码
      1. <settings?xmlns="http://maven.apache.org/SETTINGS/1.0.0"??
      2. ??xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
      3. ??xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0??
      4. ??????????????????????http://maven.apache.org/xsd/settings-1.0.0.xsd">??
      5. ??...??
      6. ??<servers>??
      7. ????<server>??
      8. ??????<id>mycompany-repository</id>??
      9. ??????<username>jvanzyl</username>??
      10. ??????<!--?Default?value?is?~/.ssh/id_dsa?-->??
      11. ??????<privateKey>/path/to/identity</privateKey>??
      12. ??????<passphrase>my_key_passphrase</passphrase>??
      13. ????</server>??
      14. ??</servers>??
      15. ??...??
      16. </settings>??
      ?

      ?

      maven的变量

      maven定义了很多变量属性,参考这里${pom.project.build.directory

    • ${project.namevalidate验证项目是否正确,以及所有为了完整构建必要的信息是否可用generate-sources生成所有需要包含在编译过程中的源代码process-sources处理源代码,比如过滤一些值generate-resources生成所有需要包含在打包过程中的资源文件process-resources复制并处理资源文件至目标目录,准备打包compile编译项目的源代码process-classes后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)generate-test-sources生成所有包含在测试编译过程中的测试源码process-test-sources处理测试源码,比如过滤一些值generate-test-resources生成测试需要的资源文件process-test-resources复制并处理测试资源文件至测试目标目录test-compile编译测试源码至测试目标目录test使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布prepare-package在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现)package将编译好的代码打包成可分发的格式,如JAR,WAR,或者EARpre-integration-test执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境integration-test如果有必要的话,处理包并发布至集成测试可以运行的环境post-integration-test执行一些在集成测试运行之后需要的动作。如清理集成测试环境。verify执行所有检查,验证包是有效的,符合质量规范install安装包至本地仓库,以备本地的其它项目作为依赖使用deploy复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)

      maven核心的插件列表可以参考Xml代码

      1. <dependency>??
      2. ????<groupId>org.hibernate</groupId>??
      3. ????<artifactId>hibernate</artifactId>??
      4. ????<version>3.2.5.ga</version>??
      5. ????<exclusions>??
      6. ??????<exclusion>??
      7. ????????<groupId>javax.transaction</groupId>??
      8. ????????<artifactId>jta</artifactId>??
      9. ??????</exclusion>??
      10. ????</exclusions>??
      11. ??</dependency>??
      ?

      ?

      问:我有一些jar文件要依赖,但是我又不想把这些jar去install到mvn的repository中去,怎么做配置?

      答:加入一个特殊的依赖关系,使用system类型,如下:

      Xml代码
      1. <dependency>??
      2. ????????<groupId>com.abc.XXX</groupId>??
      3. ????????<artifactId>工程A</artifactId>??
      4. ????????<version>${project.version}</version>??
      5. ????????<type>test-jar</type>??
      6. ????????<scope>test</scope>??
      7. </dependency>??
      ?

      ?

      变量

      问:如何使用变量替换?项目中的某个配置文件比如jdbc.properties使用了一些pom中的变量,如何在发布中使用包含真实内容的最终结果文件?

      答:使用资源过滤功能,比如:

      <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定义的目录在内。

热点排行