maven基本知识整理

来源:互联网 发布:js高级程序设计最新 编辑:程序博客网 时间:2024/06/05 02:49

1. 基本功能和用途

maven是 一个项目管理和构建自动化的工具,相比于ant,maven不需要写复杂的脚本,采用声明式的类库依赖管理。可以完成项目构建,比如生成war,打包jar;可以生成项目文档,比如javadoc;生成报告,比如junit测试报告;生成依赖类库,执行发布和部署等。
maven的安装过程比较简单,网上有很多教程,不再赘述。maven的配置,主要是配置环境变量,修改conf下的setting文件。该过程可以参考:http://maven.oschina.net/help.html

2. pom文件解析

pom文件格式整理规则
描述依赖关系的继承关系 <parent>
多模块的工程描述 <modules>
第一块应该为当前项目的相关说明。<project>
第二块为依赖中所使用的版本变量,<properties>
第三块为依赖的jar包集合 <dependencies>
第四块为依赖的jar的版本说明,解除部分依赖集 <dependencyManagement>
第五块为构建时的设置 <build>
第六块为项目中资源文件的位置<resources>
设置管理,管理项目引用不同的环境设置<profiles>
项目中引用的插件 <plugins>
插件管理 <pluginManagement>
还可以设置公告信息<reportings>许可文件<licenses>开发者信息<developers>
分发管理,告诉别的项目如何抓取本项目<distributionManagement >

其中<dependencies>中有坐标的概念,形式如:

<dependency>            <groupId>commons-lang</groupId>            <artifactId>commons-lang</artifactId>            <version>2.6</version>            <scope>***</scope> </dependency>

其中,groupId,atrifactId和version:依赖的jar的基本坐标,maven根据坐标可以找到所需要的依赖
scope:依赖的范围。maven有6种依赖范围,分别是:
1.compile:编译依赖范围。如果没有指定,所有的项目依赖都会默认使用该依赖范围。
2.test:测试依赖范围,跑单元测试时的maven依赖,例如junit
3.provided:以提供的依赖访问,例如servlet-api。web应用容器就提供了,所以不需要maven重复引入一遍
4.runtime:运行时依赖范围,例如JDBC驱动实现。
5.system:系统依赖范围,和provided依赖范围完全一直,例如jdk种rt.jar。该类依赖范围和系统配置相关,不能通过maven仓库管理,所以慎用。
6.import:导入依赖范围(目前基本没用过)。
上面的依赖范围都与相应生命周期对应的classpath对应。比如,测试时maven用的是一套classpath,运行时用的时另外一套classpath。
最好的例子还是使用junit。我们只有在测试时才会用到这个项目依赖,所以它的scope就是test。
type:依赖的类型,大部分情况下不用定义,默认值是jar
optional:标记依赖是否可选。(ps:这个太复杂,还没想好怎么简单的表述出来)

<dependencyManagement>为依赖的jar的版本说明,解除部分依赖集,解除时使用exclusions:
exclusions:用来排除传递性依赖。
这里需要解释下什么叫传递性依赖。如果一个A.jar包依赖B.jar包,B.jar包依赖于C.jar包,那么我们就认为A.jar直接依赖于B.jar,而A.jar间接依赖于C.jar.
而这种依赖关系会给项目隐式的引入很多依赖,这大大的简化了项目依赖的管理,但是有些时候这种特性也会带来问题,例如当前项目中使用了C.jar的最新版本,而B.jar中依赖的C.jar版本过低,并且新旧版本并存会直接影响到当前项目,这时就可以使用exclusions来排除依赖传递性。
一般情况下 ,在整理pom文件或引入新的jar包时,往往需要解决传递性依赖的问题。

3. 生命周期概述

生命周期是maven的核心概念。有三种内建的生命周期:default,clean,site。default解决项目发布,clean解决项目清除。
default生命周期由以下过程组成:

* validate - validate the project is correct and all necessary information is available* compile - compile the source code of the project* test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed* package - take the compiled code and package it in its distributable format, such as a JAR.* integration-test - process and deploy the package if necessary into an environment where integration tests can be run* verify - run any checks to verify the package is valid and meets quality criteria* install - install the package into the local repository, for use as a dependency in other projects locally* deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

4 基本指令整理

  1. 创建Maven的普通java项目:
mvn archetype:create   -DgroupId=packageName   -DartifactId=projectName 
  1. 创建Maven的Web项目:
    mvn archetype:create    -DgroupId=packageName       -DartifactId=webappName    -DarchetypeArtifactId=maven-archetype-webapp  
  1. 编译源代码: mvn compile
  2. 编译测试代码:mvn test-compile
  3. 运行测试:mvn test
  4. 产生site:mvn site
  5. 打包:mvn package
  6. 在本地Repository中安装jar:mvn install
  7. 清除产生的项目:mvn clean
  8. 生成eclipse项目:mvn eclipse:eclipse
  9. 生成idea项目:mvn idea:idea
  10. 组合使用goal命令,如只打包不测试:mvn -Dtest package
  11. 编译测试的内容:mvn test-compile
  12. 只打jar包: mvn jar:jar
  13. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile ( -skipping 的灵活运用,当然也可以用于其他组合命令)
  14. 清除eclipse的一些系统设置:mvn eclipse:clean

此外:
1. 构建的时候跳过测试, mvn install -Dmaven.test.skip=true 如果是eclipse,勾选那个skipTest选项
2. 在实际中通常同一个项目有多个配置文件,比如有local,dev,beta,prod等,构建的时候需要指定配置文件时,使用:mvn -Pdev package
还有一种方法是手动的改pom文件,在dev的节点下,添加:

<activation>    <activeByDefault>true</activeByDefault></activation>

参考文档:
http://cloudera.iteye.com/blog/424795
http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html
http://maven.apache.org/
http://maven.oschina.net/help.html

0 0
原创粉丝点击