(转)maven常见有关问题问答
(转)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不是什么,我们可以从如下几个要点来展开
- maven不是ant,也不是make。
我们以前接触的构建工具,需要写一些详细的步骤,比如:Xml代码- <modules>??
- ????<module>simple-weather</module>??
- ????<module>simple-webapp</module>??
- </modules>??
?其次在每个子项目中加入
Xml代码- <project>??
- ??<description>This?is?a?project?requiring?JDBC</description>??
- ??...??
- ??<dependencies>??
- ????...??
- ???<dependency>??
- ??????<groupId>org.sonatype.mavenbook</groupId>??
- ??????<artifactId>persistence-deps</artifactId>??
- ??????<version>1.0</version>??
- ??????<type>pom</type>??
- ????</dependency>??
- ??</dependencies>??
- </project>??
?属性
用户可以在maven中定义一些属性,然后在其他地方用${xxx}进行引用。比如:
Xml代码- <project>??
- ????<modelVersion>4.0.0</modelVersion>??
- ????...??
- ????<properties>??
- ????????<var1>value1</var1>??
- ????</properties>??
- </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代码
- <modules>??
- ????<module>ABCCommon</module>??
- ????<module>ABCCore</module>??
- ????<module>ABCTools</module>??
- </modules>??
??
要记住的是,这里的module是目录名,不是子工程的artifactId。子工程如下设置:
Xml代码- <parent>??
- ????<groupId>com.abc.product1</groupId>??
- ????<artifactId>abc-product1</artifactId>??
- ????<version>1.0.0-SNAPSHOT</version>??
- ??</parent>??
- ??<artifactId>abc-my-module2</artifactId>??
- ??<packaging>jar</packaging>??
??
这样两者就相互关联起来了,继承关系就设定完毕,所有父工程的配置内容都会自动在子工程中生效,除非子工程有相同的配置覆盖。如果你不喜欢层层递进的目录结构来实现继承,也可以在parent中加入Xml代码
- <dependency>??
- ??????<groupId>org.sonatype.mavenbook</groupId>??
- ??????<artifactId>persistence-deps</artifactId>??
- ??????<version>1.0</version>??
- ??????<type>pom</type>??
- ????</dependency>??
??
但是无论是父项目还是引用项目,这些工程都必须用Xml代码
- <dependency>??
- ????????<groupId>org.springframework</groupId>??
- ????????<artifactId>spring</artifactId>??
- </dependency>??
??
这种方法可以避免版本号满天飞的情况。
安装库文件到maven库中
在maven中一般都会用到安装库文件的功能,一则是我们常用的hibernate要使用jmx库,但是因为sun的license限制,所以无法将其直接包含在repository中。所以我们使用mvn命令把jar安装到我们本地的repository中
Xml代码- <distributionManagement>??
- ????<repository>??
- ??????<id>mycompany-repository</id>??
- ??????<name>MyCompany?Repository</name>??
- ??????<url>scp://repository.mycompany.com/repository/maven2</url>??
- ????</repository>??
- ??</distributionManagement>??
??
这里使用的scp方式提交库文件,还有其他方式可以使用,请参考faq部分。然后记得在你的settings.xml中加入这一内容
Xml代码- <settings?xmlns="http://maven.apache.org/SETTINGS/1.0.0"??
- ??xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
- ??xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0??
- ??????????????????????http://maven.apache.org/xsd/settings-1.0.0.xsd">??
- ??...??
- ??<servers>??
- ????<server>??
- ??????<id>mycompany-repository</id>??
- ??????<username>jvanzyl</username>??
- ??????<!--?Default?value?is?~/.ssh/id_dsa?-->??
- ??????<privateKey>/path/to/identity</privateKey>??
- ??????<passphrase>my_key_passphrase</passphrase>??
- ????</server>??
- ??</servers>??
- ??...??
- </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代码
- <dependency>??
- ????<groupId>org.hibernate</groupId>??
- ????<artifactId>hibernate</artifactId>??
- ????<version>3.2.5.ga</version>??
- ????<exclusions>??
- ??????<exclusion>??
- ????????<groupId>javax.transaction</groupId>??
- ????????<artifactId>jta</artifactId>??
- ??????</exclusion>??
- ????</exclusions>??
- ??</dependency>??
??
问:我有一些jar文件要依赖,但是我又不想把这些jar去install到mvn的repository中去,怎么做配置?
答:加入一个特殊的依赖关系,使用system类型,如下:
Xml代码- <dependency>??
- ????????<groupId>com.abc.XXX</groupId>??
- ????????<artifactId>工程A</artifactId>??
- ????????<version>${project.version}</version>??
- ????????<type>test-jar</type>??
- ????????<scope>test</scope>??
- </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定义的目录在内。