maven学习

Maven

Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以从中央信息管理项目的构建,报告和文档。Mawen为开发着提供了一套完整的构建生命周期框架。开发团队可以花很少的时间就能自动完成工程的基本构建配置。因为Maven使用了一个标准的目录结构和一个默认的构建生命周期。在创建报告,检查。构建和测试自动配置时,Maven可以让开发者的工作更简单。

Maven的目标

Maven的主要目标是允许开发人员在最短的时间内了解开发工作的完整状态。为了实现这一目标,Maven试图处理以下几个方面的问题:

  • 使构建过程容易
  • 提供统一的构建系统
  • 提供优质的项目信息
  • 提供最佳做法发展指南
  • 允许透明迁移到新功能

Maven的好处

管理项目更容易。

构建项目速度更快。

最直接的感觉就得项目体积会变小(因为使用了仓库的概念去管理jar,所以在git和svn时候存储项目体积会更小)

Maven的下载

https://maven.apache.org/download.cgi

Maven的目录结构

bin:Maven的运行脚本。mvn.bat是基于windows的脚本。在cmd中每次输入一条mvn命令都是在调用并执行这些脚本。

boot:该目录只有一个文件plexus-classworlds-x.x.x.jar.它是一个类似于java的jdk的一个类加载器。它提供了更丰富的语法以方便配置。Maven使用该框架加载自己的类库。

conf:该目录包含了一个非常重要的setting.xml。配置该文件就能在Project中定制Maven的行为。

lib:包含了所有Maven运行时需要的java类库以及用到的第三方类库。

LICENSE:软件许可证。

NOTICE.txt:所包含的第三方软件。

README.txt:包含了Maven的简介。

如何配置Maven

将你下载并解压的maven的bin的文件目录配置到自己环境变量的path。

右键“计算机”,选择“属性”,之后点击“高级系统设置”,点击“环境变量”,来设置环境变量,有以下系统变量需要配置:

新建系统变量   MAVEN_HOME  变量值:D:Javaapache-maven-3.1.1

编辑系统变量  Path         添加变量值: ;%MAVEN_HOME%in

检查是否配置好Maven:打来cmd窗口----mvn -v回车

出现以上信息就是配置成功了。

Maven的常见命令

创建Java工程

mvn archetype:generate

关于pom.xml:

maven的工程结构和内容被定义在pom.xml中。

约定优于配置。maven使用约定而不是配置,意味着开发者不需要自己再创建构建过程。

当创建maven工程时,maven会创建默认的工程结构,开发者只需要合理的放置配置文件而在pom.xml中无需做任何配置。

命令说明:

在cmd窗口打开要创建项目的位置(在创建项目位置按住shift+鼠标右键---选择在此处打开命令窗口)----执行以下命令

1. 创建Maven的普通java项目: 
   mvn archetype:create 
   -DgroupId=packageName 
   -DartifactId=projectName  
2. 创建Maven的Web项目:   
    mvn archetype:create 
    -DgroupId=packageName    
    -DartifactId=webappName 
    -DarchetypeArtifactId=maven-archetype-webapp    
3. 编译源代码: mvn compile 
4. 编译测试代码:mvn test-compile    
5. 运行测试:mvn test   
6. 产生site:mvn site   (生成站点,在target目录下的site)

7.安装当前工程的输出文件到本地仓库:mvn install(本地仓库)
8. 打包:mvn package   (java是jar包,web是war包)      mvn clean package 先清除旧的target目录再打包生成新的包
9. 在本地Repository中安装jar:mvn install 
10. 清除产生的项目:mvn clean   (清除target)
11. 生成eclipse项目:mvn eclipse:eclipse  
12. 生成idea项目:mvn idea:idea  
13. 组合使用goal命令,如只打包不测试:mvn -Dtest package   
14. 编译测试的内容:mvn test-compile  
15. 只打jar包: mvn jar:jar  (生成在target下)
16. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile 
      ( -skipping 的灵活运用,当然也可以用于其他组合命令)  
16. 清除eclipse的一些系统设置:mvn eclipse:clean 

ps: 

一般使用情况是这样,首先通过cvs或svn下载代码到本机,然后执行mvn eclipse:eclipse生成ecllipse项目文件,然后导入到eclipse就行了;修改代码后执行mvn compile或mvn test检验,也可以下载eclipse的maven插件。 

mvn -version/-v  显示版本信息 
mvn archetype:generate        创建mvn项目 
mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app   创建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> 


mvn deploy:deploy-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:client-0.1.0.jar -DrepositoryId=maven-repository-inner -Durl=ftp://xxxxxxx/opt/maven/repository/ 


发布第三方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 

mvn -e            显示详细错误 信息. 

mvn validate        验证工程是否正确,所有需要的资源是否可用。 
mvn test-compile    编译项目测试代码。 。 
mvn integration-test     在集成测试可以运行的环境中处理和发布包。 
mvn verify        运行任何检查,验证包是否有效且达到质量标准。     
mvn generate-sources    产生应用需要的任何额外的源代码,如xdoclet。 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lifxue/archive/2009/10/14/4662902.aspx 

常用命令: 
mvn -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 archetype:create -DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook 创建Maven的普通java项目,在命令行使用Maven Archetype 插件 
mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main Exec 插件让我们能够在不往 classpath 载入适当的依赖的情况下,运行这个程序 
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 jetty:run 调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用 
mvn compile 编译你的项目 
mvn clean install 删除再编译 

mvn hibernate3:hbm2ddl 使用 Hibernate3 插件构造数据库

Maven的坐标

构件定义:在maven项目中,任何依赖(jar包),或项目输出(自己打包的jar,war等)都可成为构件。

每个构件否有自己的唯一标识(唯一坐标),由groupid,artifacid,和version等信息构成,由此,maven就可以对构件进行版本控制,管理。

构件位置:构件在电脑中的位置。

groupId:一般是包名(公司组,织机构名命名)

artifactId:一般为项目名

version:当前项目的版本号

packaging:定义maven项目打包方式,也可以打包成war等。当不定义的时候,默认值是jar

classifier:它表示相同版本下针对不同的环境或者jdk使用jar,如果配置了这个元素,则会将这个元素名加在最后来查找相应的jar

Maven的仓库

Maven在某一个统一的位置存储所有项目共享构件,这个统一的位置,我们称之为仓库。

maven仓库的分类:

1本地仓库(就是在安装maven时候不会创建,是在第一次执行maven命令的时候才会被创建.默认位置:在用户目录下的.m2/repository/的仓库目录)

2远程仓库

远程仓库分为:1中央仓库 2 私服 3 其他公共库

如何更改本地仓库的默认位置:

需要更改settings.xml文件中localRepository标签。找到复制到注释以外,写自己的路径

用户范围修改: 把settings.xml直接放到.m2文件下。(一台电脑多个用户情况)

全局直接修改:maven目录中的settings.xml。(一台电脑一个用户情况)

将旧库的文件复制的新库或者是执行命令让其重新down

Maven的生命周期

maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有的构建步骤。

maven的生命周期是抽象的,即生命周期不做任何实际工作,实际任务由插件完成,类似设计模式中的模板方法。

maven有三套相互独立的生命周期,

Clean Lifecycle 在进行真正的构建之前做一些清理工作。

Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

Site Lifecycle 生成项目报告,站点,发布站点。

运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install的时候,代码会被编译,测试,打包。

这三个生命周期,每个生命周期都包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

1.clean生命周期:清理项目,包含三分phase.

1).pre-clean:执行清理前需要完成的工作。

2).clean:清理上一次构建生成的文件。

3).post-clean:执行清理后需要完成的工作。

2.default生命周期:构建项目,重要的phase如下:

1).validate:验证工程是否正确,所有需要的资源是否可用。

2).compile:编译项目的源代码。

3).test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要打包和部署。

4).Package:把已编译的代码打包成可发布的格式,比如jar。

5).integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。

6).verify:运行所有检查,验证包是否有效且达到质量标准。

7).install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。

8).Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的工程或者开发者共享。

3.site生命周期:建立和发布项目站点

1).pre-site:生成项目站点之前需要完成的工作。

2).site:生成项目站点文档。

3).post-site:生成项目站点之后需要完成的工作

4).site-deploy:将项目站点发布到服务器。

Maven的依赖聚合和继承

依赖:项目中引入的jar包(dependencies元素下添加dependency子元素)我们称作依赖。

百度maven Repository到官网在这里查询我们需要的jar包的坐标。

maven的依赖范围就是用来控制与编译、测试、运行三种classpath的关系。

maven有以下几种依赖关系:

1.compile的范围

当依赖的scope为compile的时候,那么当然这个依赖的包会在编译的时候将这个依赖包加入进来,并且在打包(mvn package)的时候也会将这个依赖加进去。

2.provided的范围

当依赖的scope为provided的时候,在编译和测试的时候有效,在执行(mvn package)进行打包成war包的时候不会加入。比如servlet-api,tomcat等web服务器中已经存在,如果打包进去,那么包之间就会冲突。

3.test的范围

当依赖的scope为test的时候,指的是在测试范围有效,在编译和打包的时候不会使用这个依赖。

4.runtime的范围

当依赖的scope为runtime的时候,在运行的时候才会依赖,在编译的时候不会依赖。

5.system(系统范围) 不推荐使用

注:在默认的情况下scope的范围是compile.

传递性

传递规则:

1依赖的传递

A->B(compile)     第一关系: a依赖b   compile

B->C(compile)     第二关系: b依赖c   compile

当在A中配置

<dependency>  
            <groupId>com.B</groupId>  
            <artifactId>B</artifactId>  
            <version>1.0</version>  
</dependency>

则会自动导入c包。关系传递如下表:

第一          第二

compile

test

provided

runtime

compile

compile

-

-

runtime

test

test

-

-

test

provided

provided

-

provided

provided

runtime

runtime

-

-

runtime

2.依赖冲突的调节

A->B->C->X(1.0)

A->D->X(2.0)

由于只能引入一个版本的包,此时Maven按照最短路径选择导入x(2.0)

A->B->X(1.0)

A->D->X(2.0)

路径长度一致,则优先选择第一个,此时导入x(1.0)

4.排除依赖

A->B->C(1.0)

此时在A项目中,不想使用C(1.0),而使用C(2.0)

则需要使用exclusion排除B对C(1.0)的依赖。并在A中引入C(2.0).

pom.xml中配置

<!--排除B对C的依赖-->

<dependency>  
            <groupId>B</groupId>  
            <artifactId>B</artifactId>  
            <version>0.1</version>  
            <exclusions>
                 <exclusion>
                    <groupId>C</groupId>  
                    <artifactId>C</artifactId><!--无需指定要排除项目的版本号-->
                 </exclusion>
            </exclusions>
</dependency> 

<!---在A中引入C(2.0)-->

<dependency>  
            <groupId>C</groupId>  
            <artifactId>C</artifactId>  
            <version>2.0</version>  
</dependency> 

5. 设置是否依赖

如果我的当前项目是project1,project1要依赖project2,project1依赖project2的配置中加上 <optional>true</optional>,表示依赖可选,false不可依赖

<dependency>
	<groupId>com.projecct</groupId>
	<artifactId>project2</artifactId>
	<version>1.0</version>
	<scope>compile</scope>
	<optional>true</optional>
</dependency>

5.依赖关系的查看

cmd进入工程根目录,执行  mvn dependency:tree

会列出依赖关系树及各依赖关系

mvn dependency:analyze    分析依赖关系

Maven的pox.xml文件详解

 1 <project xmlns="http://maven.apache.org/POM/4.0.0"  
 2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 3   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
 4                       http://maven.apache.org/maven-v4_0_0.xsd">  
 5   <modelVersion>4.0.0</modelVersion>  
 6   <groupId>org.codehaus.mojo</groupId>  
 7   <artifactId>my-project</artifactId>  
 8   <version>1.0</version>  
 9   <packaging>war</packaging>  
10 </project>  

1.<modelVersion>为maven版本号

2.groupId : 组织标识,例如:org.codehaus.mojo,在M2_REPO目录下,将是: org/codehaus/mojo目录。主要是公司名+项目名称

3.artifactId : 项目名称,例如:my-project,在M2_REPO目录下,将是:org/codehaus/mojo/my-project目录。主要是项目名+项目模块。

4.version : 版本号,例如:1.0,在M2_REPO目录下,将是:org/codehaus/mojo/my-project/1.0目录。主版本号(重大架构变更),次版本号(比较大的功能添加和变化),增量版本号(重大Bug修复)

说明:0.0.1-snapshot 

snapshot  快照

alpha 内测

beta 公测

release 稳定版本

GA 最稳定版本

Final 正式版本

Pro 专业版本

plus 加强版

retail 零售版

demo 演示版

SR 修正版

Trial 试用版

plus 加强版

shareware 共享版

full 完全版

5.packaging : 打包的格式,可以为:pom , jar , maven-plugin , ejb , war , ear , rar , par

原文地址:https://www.cnblogs.com/maoyizhimi/p/7002257.html