zoukankan      html  css  js  c++  java
  • maven入门概念及使用

    一、Maven概念

    1.maven是什么:Maven 是一个项目管理工具。它负责管理项目开发过程中的几乎所有的东西。

    版本构建输出物管理依赖关系文档和构建结果项目关系移植性管理

    2.Maven的生命周期:maven把项目的构建划分为不同的生命周期(lifecycle)。粗略一点的话,它这个过程(phase)包括:编译、测试、打包、集成测试、验证、部署。maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。

    3.Maven的标准工程结构

    MavenProjectRoot(项目根目录)
       |----src
       |     |----main
       |     |         |----java ——存放项目的.java文件
       |     |         |----resources ——存放项目资源文件,如spring, hibernate配置文件
       |     |----test
       |     |         |----java ——存放所有测试.java文件,如JUnit测试类
       |     |         |----resources ——存放项目资源文件,如spring, hibernate配置文件
       |----target ——项目输出位置
       |----pom.xml ----用于标识该项目是一个Maven项目

    4.Maven的版本规范:

    maven使用如下几个要素来唯一定位某一个输出物:

    groudId

    团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着JAVA的包的结构。例如org.apache

    artifactId 

    单独项目的唯一标识符。比如我们的tomcat, commons等。不要在artifactId中包含点号(.)。

    version 

    一个项目的特定版本。

    packaging 

    项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。

    5.maven仓库与本地仓储配置:

    根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging。

    分类:本地仓库(每个用户只有一个本地仓库,默认是在~/.m2/repository/,~代表的是用户目录),

    远程仓库(中央仓库:http://search.maven.org/、私服)

     

    从Maven中心仓库下载到本地的jar包的默认存放在”${user.home}/.m2/repository”中,${user.home}表示当前登录系统的用户目录(如"C:Usersgacl")

    自定义jar包存放位置(本地仓库):E盘创建文件加”repository”,修改apache-maven-2.2.3conf目录下的settings.xml文件,添加

    <localRepository>E:/repository</localRepository>

    6.使用Maven编译 —— 清理 —— 测试 —— 打包 —— 安装

    使用Maven编译项目,编译项目的命令是:"mvn compile"

    使用Maven清理项目,清理项目的命令是:"mvn clean"

    使用Maven测试项目,测试项目的命令是:"mvn test"

    使用Maven打包项目,打包项目的命令是:"mvn package"

    使用Maven部署项目,部署项目的命令是:"mvn install"

    8.依赖管理:

    依赖范围:依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
    1.compile 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
    2.test:测试依赖范围。只对于测试classpath有效
    2.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
    3.runtime:运行时提供。例如:jdbc驱动

    依赖传递:MakeFriends.jar直接依赖于HelloFriends.jar,而HelloFriends.jar又直接依赖于Hello.jar,那么MakeFriends.jar也依赖于Hello.jar,这就是传递性依赖,只不过这种依赖是间接依赖,如下图所示:

     

    9.聚合继承

    聚合主要为了快速构建项目,继承主要为了消除重复。如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合。

    聚合配置代码:

    <modules>
           <module>模块一</module>
           <module>模块二</module>
           <module>模块三</module>
    </modules>

    继承配置代码:

     <parent>  
              <groupId>me.gacl.maven</groupId>
              <artifactId>ParentProject</artifactId>
              <version>0.0.1-SNAPSHOT</version>
              <relativePath>../ParentProject/pom.xml</relativePath>  
     </parent>

    其中父模块用dependencyManagement管理依赖。

    PS:dependencyManagement是表示依赖jar包的声明,即你在项目中的dependencyManagement下声明了依赖,maven不会加载该依赖,dependencyManagement声明可以被继承。

    dependencyManagement的一个使用案例是当有父子项目的时候,父项目中可以利用dependencyManagement声明子项目中需要用到的依赖jar包,之后,当某个或者某几个子项目需要加载该插件的时候,就可以在子项目中dependencies节点只配置 groupId 和 artifactId就可以完成插件的引用。

    dependencyManagement主要是为了统一管理插件,确保所有子项目使用的插件版本保持一致,类似的还是plugins和pluginManagement。

    二、使用maven创建项目

    2.1 maven创建Java项目

    2.1.1 创建

    1、使用mvn archetype:generate命令,如下所示:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    2、使用mvn archetype:create命令,如下所示:

    mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    2.1.2 pom文件

    1)pom意思就是project object model。

    2)pom.xml包含了项目构建的信息,包括项目的信息、项目的依赖等。

    3)pom.xml文件是可以继承的,大型项目中,子模块的pom.xml一般都会继承于父模块的pom.xml

    2.1.3使用maven编译-清理-测试-打包-安装项目

    切换到项目目录,执行mvn clean compile / mvn clean test / mvn clean package / mvn clean install 命令分别执行。

    构建成功,就会将项目的jar包安装到本地仓库。

    运行jar包:进入命令行,切换到myapp目录,执行命令:

    java -cp targetmyapp-1.0-SNAPSHOT.jar com.mycompany.app.App

           运行项目APP的jar包

    2.2 maven创建JavaWeb项目

    2.2.1 构建

    1、使用mvn archetype:generate命令,如下所示:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-WebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

    2、使用mvn archetype:create命令,如下所示:

    mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=myWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

    2.3 创建多模块项目

    在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层)、dao(数据库访问层)、service(业务逻辑层)、web(表现层),这样分层之后,各个层之间的职责会比较明确,后期维护起来也相对比较容易,今天我们就是使用Maven来构建以上的各个层。

      项目结构如下:

    system-parent
            |----pom.xml
            |----system-domain
                    |----pom.xml
            |----system-dao
                    |----pom.xml
            |----system-service
                    |----pom.xml
            |----system-web
                    |----pom.xml

    (1)创建system-parent项目

    创建system-parent,用来给各个子模块继承。

    mvn archetype:create -DgroupId=me.gacl -DartifactId=system-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    将src文件夹删除,然后修改pom.xml文件,将<packaging>jar</packaging>修改为<packaging>pom</packaging>,pom表示它是一个被继承的模块,修改后的内容如下:

    (2)创建sytem-domain模块

    在命令行进入创建好的system-parent目录,然后执行下列命令:

    mvn archetype:create -DgroupId=me.gacl -DartifactId=system-domain -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    同时,在system-parent目录中的pom.xml文件自动添加了如下内容:

    <modules>
        <module>system-domain</module>
    </modules>

    sytem-domainpom文件为:

    修改system-domain目录中的pom.xml文件,把<groupId>me.gacl</groupId><version>1.0-SNAPSHOT</version>去掉,加上<packaging>jar</packaging>,因为groupId和version会继承system-parent中的groupId和version,packaging设置打包方式为jar

    修改后:

     

    (3)创建system-dao(类似domain)

    在命令行进入创建好的system-parent目录,然后执行下列命令:

    mvn archetype:create -DgroupId=me.gacl -DartifactId=system-dao -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    (4)创建system-service(类似domain)

    在命令行进入创建好的system-parent目录,然后执行下列命令:

    mvn archetype:create -DgroupId=me.gacl -DartifactId=system-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    (5)创建system-web

    在命令行进入创建好的system-parent目录,然后执行下列命令:

    mvn archetype:create -DgroupId=me.gacl -DartifactId=system-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

    注意,web项目的打包方式是war

    最后,system-parent的pom文件为:

     

    2.4 项目构建命令说明

    mvn archetype:create或者mvn archetype:generate  固定写法

      -DgroupId                 组织标识(包名)

      -DartifactId                项目名称

      -DarchetypeArtifactId                指定ArchetypeId,maven-archetype-quickstart,创建一个Java Project;maven-archetype-webapp,创建一个Web Project

      -DinteractiveMode             是否使用交互模式

      archetype是mvn内置的一个插件,create任务可以创建一个java项目骨架,DgroupId是软件包的名称,DartifactId是项目名,DarchetypeArtifactId是可用的mvn项目骨架,目前可以使用的骨架有:

    • maven-archetype-archetype
    • maven-archetype-j2ee-simple
    • maven-archetype-mojo
    • maven-archetype-portlet
    • maven-archetype-profiles (currently under development)
    • maven-archetype-quickstart
    • maven-archetype-simple (currently under development)
    • maven-archetype-site
    • maven-archetype-site-simple
    • maven-archetype-webapp

    每一个骨架都会建相应的目录结构和一些通用文件,最常用的是maven-archetype-quickstartmaven-archetype-webapp骨架。maven-archetype-quickstart骨架是用来创建一个Java Project,而maven-archetype-webapp骨架则是用来创建一个JavaWeb Project。

    2.5 maven常用命令

    生命周期

    阶段描述

    mvn validate

    验证项目是否正确,以及所有为了完整构建必要的信息是否可用

    mvn generate-sources

    生成所有需要包含在编译过程中的源代码

    mvn process-sources

    处理源代码,比如过滤一些值

    mvn generate-resources

    生成所有需要包含在打包过程中的资源文件

    mvn process-resources

    复制并处理资源文件至目标目录,准备打包

    mvn compile

    编译项目的源代码

    mvn process-classes

    后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)

    mvn generate-test-sources

    生成所有包含在测试编译过程中的测试源码

    mvn process-test-sources

    处理测试源码,比如过滤一些值

    mvn generate-test-resources

    生成测试需要的资源文件

    mvn process-test-resources

    复制并处理测试资源文件至测试目标目录

    mvn test-compile

    编译测试源码至测试目标目录

    mvn test

    使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布

    mvn prepare-package

    在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现)

    mvn package

    将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR

    mvn pre-integration-test

    执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境

    mvn integration-test

    如果有必要的话,处理包并发布至集成测试可以运行的环境

    mvn post-integration-test

    执行一些在集成测试运行之后需要的动作。如清理集成测试环境。

    mvn verify

    执行所有检查,验证包是有效的,符合质量规范

    mvn install

    安装包至本地仓库,以备本地的其它项目作为依赖使用

    mvn deploy

    复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)

    使用参数

    -Dmaven.test.skip=true: 跳过单元测试(eg: mcn clean package -Dmaven.test.skip=true)

    2.6 eclipse一次编译多个工程

    在Maven中,允许一个Maven Project中有多个Maven Module

    1.创建maven父工程步骤:new-->other-->选择maven project-->next-->勾选create a simple project-->next-->填写Group Id、Artifact Id、Version --> packaging选择pom-->finish。

    2.创建maven子工程步骤:选中刚才创建的父工程右键-->new-->other-->选择maven module-->next-->勾选create a simple project-->填写module name(其实就是artifact id)-->next-->GAV继承父工程-->packaging选择你需要的-->finish。

    3.完成,刷新父工程;如有多个子工程,继续按照第二步骤创建。

     

    这时打开XXX中的pom.xml可以看到其中有以下标签

    <modules>

      <module>xxx1</module>

    </modules>

    选择编译XXX时,会依次对它的所有Module执行相同操作。

  • 相关阅读:
    【Objective-C 篇】 ☞ 9. 协议
    【Objective-C 篇】 ☞ 8. block
    【Objective-C 篇】 ☞ 7. Category、Extension
    【Objective-C 篇】 ☞ 6. 封装、继承、组合与聚合、多态
    【Objective-C 篇】 ☞ 5. MRC、ARC
    【Objective-C 篇】 ☞ 4. 内存管理
    【Objective-C 篇】 ☞ 3. self、数据类型、编码规范
    【Objective-C 篇】 ☞ 2. 属性、方法
    【Objective-C 篇】 ☞ 1. 基础、语法
    【Objective-C 篇】 ☞ 学前准备
  • 原文地址:https://www.cnblogs.com/limaosheng/p/8631616.html
Copyright © 2011-2022 走看看