preface
早在2010年就听说了maven这个强大的工具,只是一直未能有机会在工作中尝试,让我苦恼了很旧,最近经理决定升级项目框架,才用maven来作为项目管理工具,让我好是开心了一番.
what is Maven ?
绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。 构建工程师和项目经理会说Maven是一个更复杂的东西:一个项目管理工具。那么区别是什么? 像Ant这样的构建工具仅仅是关注预处理,编译,打包,测试和分发。像 Maven 这样的一个项目管理工具提供了构建工具所提供功能的超集。 除了提供构建的功能,Maven还可以生成报告,生成Web站点,并且帮助推动工作团队成员间的交流。一个更正式的 Apache Maven 的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
what are the differences between maven and ant?
Ant在构建过程方面十分优秀,它是一个基于任务和依赖的构建系统。每个任务包含一组由 XML 编码的指令。有 copy 任务和 javac 任务,以及 jar 任务。在你使用 Ant的时候,你为 Ant 提供特定的指令以编译和打包你的输出。你必须明确告诉 Ant 你的源码在哪里,结果字节码你想存储在哪里,如何将这些字节码打包成 JAR 文件。当然,Maven还有更强大的功能,简言之,Maven是一个项目管理工具,ant是一个项目构建工具。
下面就项目构建方面对Maven和ant做下简单对比。
Apache Ant
- Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码,哪里放置输出。随着时间的推移,非正式的约定出现了,但是它们还没有在产品中模式化。
- Ant 是程序化的,你必须明确的告诉 Ant 做什么,什么时候做。你必须告诉它去编译,然后复制,然后压缩。
- Ant 没有生命周期,你必须定义目标和目标之间的依赖。你必须手工为每个目标附上一个任务序列。
Apache Maven
- Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字节码放到 target/classes ,然后在 target 生成一个 JAR 文件。
- Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。
- Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
what advantages maven have ?
- 工具可移植性/集成
- 标准的项目布局和项目结构生成器
- 多项目支持
- 丰富的插件支持
- maven中央仓库
install maven
安装Maven的步骤非常简单:首先从Maven官方网站http://maven.apache.org/下载相应的软件包,目前是Maven 3.1.1;然后解压,并设置环境变量M2_HOME= Maven的解压安装目录;最后将%M2_HOME%/bin添加到path中,方便Maven在任何目录下运行。检查一下是否已经完成安装,打开dos窗口,输入mvn –v,如果出现一下信息则表示maven3已经安装成功:
X:>mvn –v
Apache Maven 3.1.1
Common commands
mvn -version/-v 显示版本信息
mvn help:describe -Dplugin=help 使用 help 插件的 describe 目标来输出 Maven Help 插件的信息。
mvn help:describe -Dplugin=help -Dfull 使用Help 插件输出完整的带有参数的目标列
mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull 获取单个目标的信息,设置 mojo 参数和 plugin 参数。此命令列出了Compiler 插件的compile 目标的所有信息
mvn help:describe -Dplugin=exec -Dfull 列出所有 Maven Exec 插件可用的目标
mvn help:effective-pom 看这个“有效的 (effective)”POM,它暴露了 Maven的默认设置
mvn dependency:resolve 打印出已解决依赖的列表
mvn dependency:tree 打印整个依赖树
mvn install -X 想要查看完整的依赖踪迹,包含那些因为冲突或者其它原因而被拒绝引入的构件,打开 Maven 的调试标记运行
mvn install -Dmaven.test.skip=true 给任何目标添加maven.test.skip 属性就能跳过测试
mvn install assembly:assembly 构建装配Maven Assembly 插件是一个用来创建你应用程序特有分发包的插件
mvn -e 显示详细错误 信息.
mvn validate 验证工程是否正确,所有需要的资源是否可用。
mvn test-compile 编译项目测试代码。 。
mvn integration-test 在集成测试可以运行的环境中处理和发布包。
mvn verify 运行任何检查,验证包是否有效且达到质量标准。
mvn generate-sources 产生应用需要的任何额外的源代码,如xdoclet。
mvn archetype:generate 创建mvn项目
mvn package 生成target目录,编译、测试代码,生成测试报告,生成jar/war文件
mvn jetty:run 运行项目于jetty上,
mvn compile 编译
mvn test 编译并测试
mvn clean 清空生成的文件
mvn site 生成项目相关信息的网站
mvn -Dwtpversion=1.0 eclipse:eclipse 生成Wtp插件的Web项目
mvn -Dwtpversion=1.0 eclipse:clean 清除Eclipse项目的配置信息(Web项目)
mvn eclipse:eclipse 将项目转化为Eclipse项目
在应用程序用使用多个存储库
<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>Planet Mirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>
发布第三方Jar到本地库中:
mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:/client-0.1.0.jar -DdownloadSources=true -DdownloadJavadocs=true
create project
生成项目布局:mvn archetype:generate -DgroupId=com.oreilly -DartifactId=my-app
创建完项目后,我们可以往项目里添加代码并使用Maven的所有全新技巧。注意以下命令必须在pom.xml文件所在的目录中运行。
–mvn test:运行应用程序中的单元测试
–mvn package:依据项目生成jar文件,以备依赖此项目时使用
–mvn install:将项目的jar文件添加到库中,
–mvn site:生成项目相关信息的网站
–mvn clean:清除目标目录中的生成结果
–mvn eclipse:eclipse:生成Eclipse项目文件
maven构建的生命周期
在Maven2中就引入了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。主要的生命周期阶段:
validate,验证工程是否正确,所有需要的资源是否可用。compile,编译项目的源代码。test-compile,编译项目测试代码。test,使用已编译的测试代码,测试已编译的源代码。package,已发布的格式,如jar,将已编译的源代码打包。integration-test,在集成测试可以运行的环境中处理和发布包。verify,运行任何检查,验证包是否有效且达到质量标准。install,把包安装在本地的repository中,可以被其他工程作为依赖来使用deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。generate-sources,产生应用需要的任何额外的源代码,如xdoclet。如果要执行项目编译,那么直接输入:mvn compile即可,对于其他的阶段可以类推。阶段之间是存在依赖关系(dependency)的,如test依赖test-compile。在执行mvn test时,会先运行mvn test-compile,然后才是mvn test。
maven plugins
1)maven-compiler-plugin 指定JDK版本<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<showWarnings>true</showWarnings>
<encoding>gbk</encoding>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-javac</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
</plugin>
2)maven-war-plugin 打war包 在web子项目中指定
<build>
<finalName>launcher</finalName>
<directory>target/jboss</directory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.vm</include>
</includes>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
3)单元测试插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
<!-单元测试失败依然打包-->
<skip>true</skip> 是否过滤单元测试
<!--<includes>
<include>**/*Test.java</include>
</includes>-->
<excludes>
<exclude>**/*Test.java</exclude>
</excludes>
</configuration>
</plugin>
4)jar包插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
是否增加maven描述信息
<manifest>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Implementation-Build>${buildNumber}</Implementation-Build>
</manifestEntries>
</archive>
</configuration>
</plugin>
5)resource插件 类似antx的auto-config功能Mvn package –Pdev dev即定义的ID
Antx中的属性文件在Maven中如何引用?
在主pom.xml中增加配置属性
<profiles>中可以有多个profile, id需唯一
<profiles>
<profile>
<id>dev</id>
<properties>
<props>launcher.properties.dev</props>
<dependency.version.ext>-SNAPSHOT</dependency.version.ext>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
是否默认引用此文件 如果此项为true,引用此文件 参数-P可以不加
</activation>
</profile>
</profiles>
根据外部属性文件填写需要过滤文件中的变量,默认会生成到classes目录
<filters>
<filter>jdbc.properties.dev</filter>
Filter 配置项指定过滤那个文件?
1) 可以写文件名
2) 也可以写-P指定的profile ,
引用的是上述定义的profile dbc.properties.dev替换为../${props}
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
true需要过滤,false不需要过滤
<includes> 需要过滤的文件
<include>**/*.*</include>
<include>**/*</include>
</includes>
<excludes> 那些文件不需要移动到classes目录
<exclude>**/*.xml</exclude>
<exclude>**/*.vm</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
6)maven-eclipse-plugin插件<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.8</version>
<configuration>
<sourceExcludes>
<sourceExclude>**/.svn/</sourceExclude>
</sourceExcludes>
<downloadSources>true</downloadSources>
</configuration>
</plugin>